2012-08-15 2 views
0

내가 서버TcpListener (포트)

하지만 파일이 서버로 전송하면, 서버는 모든 파일을받지 않습니다에 파일을 전송하거나 업로드 할 수 있습니다 클라이언트 TCP/IP를 통한 파일 공유를 만들려고 오류 C# 파일 공유를 가지고

이 내 코드

FileSharingClient.cs입니다

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Threading.Tasks; 
using System.Net; 
using System.Net.Sockets; 
using System.Net.NetworkInformation; 
using System.IO; 


namespace FileSharingClient 
{ 
    public partial class Form1 : Form 
    { 
     private static string shortFileName = ""; 
     private static string fileName = ""; 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void btnBrowse_Click(object sender, EventArgs e) 
     { 
      OpenFileDialog dlg = new OpenFileDialog(); 
      dlg.Title = "File Sharing Client"; 
      dlg.ShowDialog(); 
      txtFile.Text = dlg.FileName; 
      fileName = dlg.FileName; 
      shortFileName = dlg.SafeFileName; 
     } 

     private void btnSend_Click(object sender, EventArgs e) 
     { 
      string ipAddress = txtIPAddress.Text; 
      int port = int.Parse(txtHost.Text); 
      string fileName = txtFile.Text; 
      Task.Factory.StartNew(() => SendFile(ipAddress,port,fileName,shortFileName)); 
      MessageBox.Show("File Sent"); 
     } 

     public void SendFile(string remoteHostIP, int remoteHostPort, string longFileName, string shortFileName) 
     { 
      try 
      { 
       if (!string.IsNullOrEmpty(remoteHostIP)) 
       { 
        byte[] fileNameByte = Encoding.ASCII.GetBytes(shortFileName); 
        byte[] fileData = File.ReadAllBytes(longFileName); 
        byte[] clientData = new byte[4 + fileNameByte.Length + fileData.Length]; 
        byte[] fileNameLen = BitConverter.GetBytes(fileNameByte.Length); 
        fileNameLen.CopyTo(clientData, 0); 
        fileNameByte.CopyTo(clientData, 4); 
        fileData.CopyTo(clientData, 4 + fileNameByte.Length); 
        TcpClient clientSocket = new TcpClient(remoteHostIP, remoteHostPort); 
        NetworkStream networkStream = clientSocket.GetStream(); 
        networkStream.Write(clientData, 0, clientData.GetLength(0)); 
        networkStream.Close(); 
       } 
      } 
      catch 
      { 

      } 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 

     } 
    } 
} 

FileSharingServer.cs

,369 이 라인 (FileSharingServer)

TcpListener tcpListener = new TcpListener(port); 

에서 1,363,210

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Net; 
using System.Net.Sockets; 
using System.Net.NetworkInformation; 
using System.IO; 
using System.Threading.Tasks; 

namespace FileSharingServer 
{ 
    public partial class Form1 : Form 
    { 

     public delegate void FileRecievedEventHandler(object source, string fileName); 
     public event FileRecievedEventHandler NewFileRecieved; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      this.NewFileRecieved+=new FileRecievedEventHandler(Form1_NewFileRecieved); 
     } 

     private void Form1_NewFileRecieved(object sender, string fileName) 
     { 
      this.BeginInvoke(    
      new Action(
      delegate() 
      { 
       MessageBox.Show("New File Recieved\n"+fileName); 
       System.Diagnostics.Process.Start("explorer", @"c:\"); 
      })); 
     } 



     private void btnListen_Click(object sender, EventArgs e) 
     { 
      int port = int.Parse(txtHost.Text); 
      Task.Factory.StartNew(() => HandleIncomingFile(port)); 
      MessageBox.Show("Listening on port"+port); 
     } 


     public void HandleIncomingFile(int port) 
     { 
      try 
      { 
       TcpListener tcpListener = new TcpListener(port); 
       tcpListener.Start(); 
       while (true) 
       { 
        Socket handlerSocket = tcpListener.AcceptSocket(); 
        if (handlerSocket.Connected) 
        { 
         string fileName = string.Empty; 
         NetworkStream networkStream = new NetworkStream(handlerSocket); 
         int thisRead = 0; 
         int blockSize = 1024; 
         Byte[] dataByte = new Byte[blockSize]; 
         lock (this) 
         { 
          string folderPath = @"c:\"; 
          handlerSocket.Receive(dataByte); 
          int fileNameLen = BitConverter.ToInt32(dataByte, 0); 
          fileName = Encoding.ASCII.GetString(dataByte, 4, fileNameLen); 
          Stream fileStream = File.OpenWrite(folderPath + fileName); 
          fileStream.Write(dataByte, 4+fileNameLen,(1024-(4+fileNameLen))); 
          while (true) 
          { 

           thisRead = networkStream.Read(dataByte, 0, blockSize); 
           fileStream.Write(dataByte, 0,thisRead); 
           if (thisRead == 0) 
            break; 
          } 
          fileStream.Close(); 


         } 
         if (NewFileRecieved != null) 
         { 
          NewFileRecieved(this, fileName); 
         } 
         handlerSocket = null; 
        } 
       } 

      } 
      catch 
      { 

      } 
     } 
    } 
} 
나는

Warning 1 'System.Net.Sockets.TcpListener.TcpListener(int)' is obsolete: '"This method has been deprecated. Please use TcpListener(IPAddress localaddr, int port) instead. http://go.microsoft.com/fwlink/?linkid=14202"' 

사람이 고칠 수 내 FileSharingServer에서 오류 메시지를 받았습니다 ?? 당신이해야`networkStream.Flush()`,

TcpListener tcpListener = new TcpListener(System.Net.IPAddress.Any, port); 
+0

데이터를 작성 후 스트림을 닫기 전에 : 감사 – spender

답변

1

당신이 수신 할 IP 주소와 포트를 지정해야합니다. 누군가 다른 사람도 똑같이하기로 결정할 때 당신이 끔찍한 고통의 세계에 대비하지 않는다면, 결코 '이'를 잠그지 않아야합니다.
+0

감사 나는 오류 를 얻을하지 않습니다하지만 난 서버에 파일을 보낼 때, 서버는 클라이언트에서 파일을 수신에 나는 위치를 지정한 모든 파일 .. 이 문제를 알고를 수신하지 않습니다? –

+0

새로운 질문을해야합니다. 파일이 전혀 존재하지 않는다면'Stream fileStream = File.OpenWrite (...)'는 존재하지 않는다면 그 라인이 파일을 생성하기 때문에 실행되지 않습니다. –

관련 문제