2013-10-11 139 views
0

我有一個網絡流,它有文件名和filedata。我在一些塊中發送文件,每個塊都帶有文件名以便於識別。您能否幫助我正確讀取網絡數據流並將所有數據寫入文件流。 當我從網絡流寫入數據時,我似乎錯過了幾個字節。 說例如文件名長度將在其索引中,文件名將從第4個索引開始。從TCP偵聽器中的網絡流中讀取數據

Client: 

    int NoOfPackets = Convert.ToInt32 
      (Math.Ceiling((Convert.ToDouble(Fs.Length))/ Convert.ToDouble(BufferSize))); 
      int TotalLength = (NoOfPackets *4+fileNameByte.Length) +(int)Fs.Length,  CurrentPacketLength, counter = 0; 
     netstream1 = client.GetStream(); 
      for (int i = 0; i < NoOfPackets+1 ; i++) 
      { 

       if (TotalLength > BufferSize) 
       { 
        CurrentPacketLength = BufferSize; 
        TotalLength = TotalLength - CurrentPacketLength; 
       } 
       else 
        CurrentPacketLength = TotalLength; 
       SendingBuffer = new byte[CurrentPacketLength]; 
      fileNameLength.CopyTo(SendingBuffer, 0); 
       fileNameByte.CopyTo(SendingBuffer, 4); 
       Fs.Read(SendingBuffer, 4 + fileNameByte.Length, CurrentPacketLength - (4 + fileNameByte.Length)); 
      netstream1.Write(SendingBuffer, 0, SendingBuffer.Length); 
       netstream1.Flush(); 
       } 

監聽器代碼:

  client = Listener.AcceptTcpClient(); 
        client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true); 
        //client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Linger, true); 
        client.Client.LingerState = new LingerOption(true, 300); 
        client.Client.SendTimeout = 300000;      
        client.Client.ReceiveTimeout = 300000; 
        client.NoDelay = true; 
        NetworkStream netstream = client.GetStream(); 

        MemoryStream ms = new MemoryStream(); 
        bool first = true; 
        string fullPath = ""; 
        byte[] RecData = new byte[512000]; 

        while ((RecBytes = netstream.Read 
         (RecData, 0, RecData.Length)) > 0) 
        { 

         int fileNameLen = RecData[0]; 

         if (fileNameLen > 0 && first) 
         { 
          string name1 = "", name2 = ""; 
          first = false; 

          name1 = Encoding.UTF8.GetString(RecData, 4, fileNameLen); 


          name2 = name1; 

          string folderName = ""; 
          if (name2.Contains("\\")) 
          { 
           folderName = name2.Substring(0, name2.LastIndexOf("\\")); 
           if (!Directory.Exists("D:\\123\\" + folderName)) 
            Directory.CreateDirectory("D:\\123\\" + folderName); 

          } 
          if (folderName != "") 
           fullPath = "D:\\123\\" + folderName + "\\" + name2.Substring(name2.LastIndexOf("\\") + 1); 
          else 
           fullPath = "D:\\123\\" + name2.Substring(name2.LastIndexOf("\\") + 1); 
         } 


         if (!File.Exists(fullPath)) 
         { 

          //file = new FileStream(fullPath, FileMode.OpenOrCreate, FileAccess.Write); 

          while (true) 
          { 
           try 
           { 
            using (FileStream file = new FileStream(fullPath, FileMode.OpenOrCreate, FileAccess.Write)) 
            { 

             if (RecBytes - (4 + fileNameLen) > 0) 
              file.Write(RecData, 4 + fileNameLen, RecBytes - (4 + fileNameLen)); 
             break; 
            } 
           } 
           catch (IOException) 
           { 

            Thread.Sleep(20); 
           } 
          } 
          //using (file = File.Create(fullPath)) 
          //{ 
          // file.Write(data, 4 + fileNameLen, (int)data.Length - (4 + fileNameLen)); 
          //} 


         } 
         else 
         { 

          while (true) 
          { 
           try 
           { 
            using (FileStream file = new FileStream(fullPath, FileMode.Append, FileAccess.Write)) 
            { 

             if (RecBytes - (4 + fileNameLen) > 0) 
              file.Write(RecData, 4 + fileNameLen, RecBytes - (4 + fileNameLen)); 
             break; 
            } 
           } 
           catch (IOException) 
           { 

            Thread.Sleep(20); 
           } 
          } 

         } 


        } 

        ms.Close(); 

        netstream.Close(); 
        client.Close(); 
+1

請顯示您的相關代碼以及您嘗試的內容。 – CodeCaster

+0

使用給定的信息不可能找到問題。 – usr

回答

0

即使你是那樣的模糊因爲任何人都可以,我還是會建議你創建一個結構,使數據的序列化和反序列化可以在完成一個已知的格式!並且可以避免數據丟失! 再次如果你的方法是已知的,這將是很大的幫助回答你的問題。