2011-05-05 29 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