这是我的服务器端代码,用于向客户端发送数据:
public bool SendMessage(Socket socket, byte[] message, string logMessage = "Unknow")
{
try
{
MsgTemp msg = new MsgTemp(socket, logMessage, message);
System.Diagnostics.Trace.WriteLine(" send ---------- " + message.Length.ToString());
socket.BeginSend(message, 0, message.Length, SocketFlags.None, new AsyncCallback(SendCallBack), msg /* null*/);
return true;
}
catch
{
// :) removed
}
return false;
}
此代码在客户端接收回调方法:
private void ReceiverCallBack(IAsyncResult ar)
{
try
{
int size = _socket.EndReceive(ar);
_socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiverCallBack), null);
System.Diagnostics.Trace.WriteLine(" received ---------- " + size.ToString());
// messagereceived is an event
if (MessageReceived != null)
{
byte[] temp = new byte[size];
Array.Copy(_buffer, temp, size);
MessageReceived(temp);
}
}
catch (Exception exp)
{
// :) removed
}
}
当服务器向客户端数据发送许多包时无效。 (正常/低交易正常工作)
看到这个(字节是在对话中的服务器和客户端之间发送的):
send ---------- 496
received ---------- 496
send ---------- 613
received ---------- 613
send ---------- 680
received ---------- 680
send ---------- 227
send ---------- 697
received ---------- 227
send ---------- 722
send ---------- 710
received ---------- 697
received ---------- 1432
两个最后一个包被发送到一个包中收到的客户端 - > 722 + 710 = 1432 并且数据无效/无法使用......
为什么?感谢答案 0 :(得分:1)
这就是TCP的工作方式 - 它是一个流协议。保证按照发送顺序接收字节,但您可以一次Receive
多个Send
操作的数据,或者在两个中接收一个Send
操作的数据Receive
秒。
你必须以某种方式定义消息是什么 - 首先发送消息的大小,然后是消息有效负载。
参见例如http://blog.stephencleary.com/2009/04/message-framing.html - 它包含对原因,方法和代码示例的详细解释。网上还有很多其他例子。