2012-08-15 108 views
0

我尽量让在TCP/IP文件共享的客户端可以发送或上传文件到服务器的TcpListener(端口)遇到错误C#FILESHARING

但是当文件发送到服务器,服务器不接收任何文件

这是我的代码

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

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 
      { 

      } 
     } 
    } 
} 

在这条线(FileSharingServer)

TcpListener tcpListener = new TcpListener(port); 

和我在我的FileSharingServer一个错误消息,这是

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"' 

任何人都可以修复它? 感谢

+0

之前写入数据后关闭流,你应该'networkStream.Flush()'。除非你准备好了一个可怕的痛苦世界,否则别人也会决定去做这件事。 – spender 2012-08-15 05:10:57

回答

1

你需要指定IP地址和端口上侦听:

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

感谢 我没有得到任何错误 但是当我发送到文件服务器,服务器没有收到从客户端接收文件I指定的位置中的任何文件 .. 你知道的问题? – 2012-08-15 05:18:48

+0

你应该为此提出一个新问题。如果文件根本不存在,那么'Stream fileStream = File.OpenWrite(...)'不会被执行,因为如果该文件不存在,该行会创建该文件。 – 2012-08-15 06:37:15