2010-09-02 74 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

對此的簡短回答是,做它像乒乓球,發送第一個文件,讓客戶回覆,再發送另一個文件,讓客戶回覆等。