2010-09-02 40 views
0

我试图通过TCP使用C#TcpClient发送多个文件,对于单个文件它很好,但是当我有多个文件时,它只发送第一个。通过TCP发送多个文件与C#使用TcpClient

这里是我的代码:

发送文件

try 
{ 
    TcpClient tcpClient = new TcpClient(); 
    NetworkStream networkStream; 
    FileStream fileStream = null; 

    tcpClient.Connect(appUpdateMessage.receiverIpAddress, 12000); 
    networkStream = tcpClient.GetStream(); 

    byte[] byteSend = new byte[tcpClient.ReceiveBufferSize]; 
    string startupPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase).Substring(6); 

    DirectoryInfo directoriesInfo = new DirectoryInfo(startupPath); 
    DirectoryInfo[] directories = directoriesInfo.GetDirectories(); 
    FileInfo[] files = directoriesInfo.GetFiles(); 


    for (int iLoop = 0; iLoop < directories.Length; iLoop++) 
    { 
     FileInfo[] subdirectoryFiles = directories[iLoop].GetFiles(); 

     foreach (FileInfo fi in subdirectoryFiles) 
     { 
      fileStream = new FileStream(fi.FullName, FileMode.Open, FileAccess.Read); 

      BinaryReader binFile = new BinaryReader(fileStream); 

      FileUpdateMessage fileUpdateMessage = new FileUpdateMessage(); 
      fileUpdateMessage.fileName = fi.Name; 
      fileUpdateMessage.fileSize = fi.Length; 
      fileUpdateMessage.targetDirectory = fi.Directory.Name; 

      MessageContainer messageContainer = new MessageContainer(); 
      messageContainer.messageType = MessageType.FileProperties; 
      messageContainer.messageContnet = SerializationManager.XmlFormatterObjectToByteArray(fileUpdateMessage); 

      byte[] messageByte = SerializationManager.XmlFormatterObjectToByteArray(messageContainer); 

      networkStream.Write(messageByte, 0, messageByte.Length); 

      int bytesSize = 0; 
      byte[] downBuffer = new byte[2048]; 
      while ((bytesSize = fileStream.Read(downBuffer, 0, downBuffer.Length)) > 0) 
      { 
       networkStream.Write(downBuffer, 0, bytesSize); 
      } 
      fileStream.Close(); 
     } 
    } 
    tcpClient.Close(); 
    networkStream.Close(); 

    return true; 
} 
catch (Exception ex) 
{ 
    //logger.Info(ex.Message); 
    return false; 
} 
finally 
{ 

} 

接收文件

try 
{ 
    TcpClient tcpClient = c as TcpClient; 
    NetworkStream networkstream = tcpClient.GetStream(); 
    FileStream fileStream = null; 
    byte[] _data = new byte[1024]; 
    int _bytesRead = 0; 

    _bytesRead = networkstream.Read(_data, 0, _data.Length); 

    MessageContainer messageContainer = new MessageContainer(); 
    messageContainer = SerializationManager.XmlFormatterByteArrayToObject(_data, messageContainer) as MessageContainer; 

    switch (messageContainer.messageType) 
    { 
     case MessageType.FileProperties: 
      FileUpdateMessage fileUpdateMessage = new FileUpdateMessage(); 
      fileUpdateMessage = SerializationManager.XmlFormatterByteArrayToObject(messageContainer.messageContnet, fileUpdateMessage) as FileUpdateMessage; 
      string startupPath = @"d:updatefolder";//System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase).Substring(6); 

      DirectoryInfo mainDirectory = new DirectoryInfo(startupPath); 
      DirectoryInfo targetDirecotry = new DirectoryInfo(startupPath + "\\" + fileUpdateMessage.targetDirectory); 

      if (!targetDirecotry.Exists) 
      { 
       mainDirectory.CreateSubdirectory(fileUpdateMessage.targetDirectory); 
      } 

      fileStream = new FileStream(startupPath + "\\" + fileUpdateMessage.targetDirectory + "\\" + fileUpdateMessage.fileName, FileMode.Create, FileAccess.Write, FileShare.ReadWrite); 
      long filezie = fileUpdateMessage.fileSize; 
      int byteSize = 0; 

      byte[] downBuffer = new byte[2048]; 

      while ((byteSize = networkstream.Read(downBuffer, 0, downBuffer.Length)) > 0) 
      { 
       fileStream.Write(downBuffer, 0, byteSize); 
       if (this.InvokeRequired) 
       { 
        this.Invoke((MethodInvoker)delegate 
        { 
         //progressBar1.Value = Convert.ToInt32((byteSize * 100)/fileUpdateMessage.fileSize); 

         progressBar1.Value = Convert.ToInt32((fileStream.Length * 100)/fileUpdateMessage.fileSize); 
         lblFileName.Text = fileUpdateMessage.fileName; 
        }); 
       } 
       else 
       { 
        //progressBar1.Value = Convert.ToInt32((byteSize * 100)/fileUpdateMessage.fileSize); 
        lblFileName.Text = fileUpdateMessage.fileName; 
       } 
      } 
      fileStream.Close(); 
      networkstream.Close(); 
      break; 
    } 
} 
catch (Exception ex) 
{ 
    //logger.Error(ex.Message); 
} 

任何想法,我做错了什么?

+1

这不是你的问题,但在服务器端,我会在tcpclient之前关闭网络流。 – Jess 2010-09-03 15:45:23

回答

1

在你的发送代码中,你有一个循环你发送多个文件。在接收端,我没有看到相应的循环。

您可以发送即将发送的文件数量,并且可以多次执行客户端循环。您也可以在每个文件结束后发送一些内容,这会指示“这是另一个文件”或“我已完成,现在关闭所有内容”。

0

对此的简短回答是,做它像乒乓球,发送第一个文件,让客户回复,再发送另一个文件,让客户回复等。