2011-05-05 54 views
2

當我很快地從客戶端多次發送數據時,我不會在服務器中分別接收這些數據。我收到他們作爲一個大型數據突發。我需要爲每個收到的數據發送回覆。但是我不能這樣做,因爲這些數據會在一個大爆發中加入。我怎樣才能發送每個收到的數據的答覆? 在這裏,在服務器回調方法的代碼:C#接收數據的問題

private void RecieveCallback(IAsyncResult asyncResult) 
    { 
     ConnectionInfo connection = (ConnectionInfo)asyncResult.AsyncState; 
     try 
     { 
      int bytesRead = connection.Socket.EndReceive(asyncResult); 

      if (bytesRead > 0) 
      { 
       for (int i = 0; i < bytesRead; i++) 
        connection.FullBufferReceive.Add(connection.BufferReceive[i]); 
       if (bytesRead == connection.BufferReceive.Length) 
       { 
        connection.Socket.BeginReceive(connection.BufferReceive, 0, connection.BufferReceive.Length, 0, 
                new AsyncCallback(RecieveCallback), connection); 
        Console.WriteLine("Bytes recieved -- " + bytesRead + " by " + connection.Id); 
       } 
       else 
       { 
        Console.WriteLine("Bytes recieved " + bytesRead + " by " + connection.Id); 

        _serverController.StartProcess(connection); 
       } 
      } 
      else 
       CloseConnection(connection); 
     } 
     catch (Exception e) 
     { 
      CloseConnection(connection); 
      Console.WriteLine(e.ToString()); 
     } 
    } 
+1

問題是?請描述該問題;) – 2011-05-05 18:07:57

+0

客戶端代碼可能會更有用。也許你需要調用'.Flush()'。 – 2011-05-05 18:09:23

回答

3

如果你的套接字是TCP(我不能從代碼告訴),這是預期的行爲,TCP是不是陷害像UDP是。你需要自己分隔數據。

+0

+1,同樣當使用UDP時,如果其中一個網絡跳數認爲它太大,則可能會拆分消息。 – 2011-05-05 18:16:53

+0

是的,我使用TCP連接。 – Dav 2011-05-05 18:17:08

+0

好吧,那麼這意味着什麼:當你在你的客戶端上「發送」X字節,並在你的服務器上讀取時,不要期待返回X字節。你需要繼續閱讀,直到你找到你的協議規定的分隔符爲止(比如換行符 - 另一種選擇是首先發送數據的長度來讀取某種編碼,然後發送數據並繼續閱讀直到你閱讀了這麼多)。祝你好運! – paquetp 2011-05-06 13:06:52