问题描述
privatevoidReceiveCallBack(IAsyncResultar){StateObjectstate=(StateObject)ar.AsyncState;SocketserverSocket=state.workSocket;try{intbytesRead=serverSocket.EndReceive(ar);if(bytesRead>0){byte[]data=newbyte[bytesRead];//实际接收的数据Buffer.BlockCopy(state.buffer,0,data,0,data.Length);ar.AsyncWaitHandle.Close();Event_ReceiveData(serverSocket,data);state.buffer=newbyte[StateObject.BufferSize];serverSocket.BeginReceive(state.buffer,0,StateObject.BufferSize,SocketFlags.None,newAsyncCallback(ReceiveCallBack),state);}}catch(SocketExceptionex){if(ex.Message.IndexOf("远程主机强迫关闭了一个现有的连接")!=-1){listSocket.Remove(serverSocket);}else{throwex;}}}publicclassStateObject{//服务器/客户端的套接字publicSocketworkSocket=null;//缓冲区的大小.publicconstintBufferSize=1024;//缓冲区bufFer.publicbyte[]buffer=newbyte[BufferSize];//将收到的buffer转出string.publicStringBuildersb=newStringBuilder();}
以上代码是异步接收数据的代码服务器端给我发送一次数据的时候这个方法走了两次是什么情况
解决方案
解决方案二:
参考一下吧
解决方案三:
TCP粘包导致的多次接受
解决方案四:
如果你发过来的包太长了,就分两次接收,这是正常的。
解决方案五:
引用3楼wyd1520的回复:
如果你发过来的包太长了,就分两次接收,这是正常的。
我定义的是1024每次发送都小于1024
解决方案六:
还有Socket发包时有一个缓冲区,如果底层的缓冲区被修改为较短的话也会分包;总而言之,就是一个半包的现象,你再从发送到接收的流程过一遍,看看是什么地方导致了这个问题。这个问题如果是在不同电脑间传数据,是会经常发生的,其他还有粘包现象。
解决方案七:
引用楼主l397870376的回复:
privatevoidReceiveCallBack(IAsyncResultar){StateObjectstate=(StateObject)ar.AsyncState;SocketserverSocket=state.workSocket;try{intbytesRead=serverSocket.EndReceive(ar);if(bytesRead>0){byte[]data=newbyte[bytesRead];//实际接收的数据Buffer.BlockCopy(state.buffer,0,data,0,data.Length);ar.AsyncWaitHandle.Close();Event_ReceiveData(serverSocket,data);state.buffer=newbyte[StateObject.BufferSize];serverSocket.BeginReceive(state.buffer,0,StateObject.BufferSize,SocketFlags.None,newAsyncCallback(ReceiveCallBack),state);}}catch(SocketExceptionex){if(ex.Message.IndexOf("远程主机强迫关闭了一个现有的连接")!=-1){listSocket.Remove(serverSocket);}else{throwex;}}}publicclassStateObject{//服务器/客户端的套接字publicSocketworkSocket=null;//缓冲区的大小.publicconstintBufferSize=1024;//缓冲区bufFer.publicbyte[]buffer=newbyte[BufferSize];//将收到的buffer转出string.publicStringBuildersb=newStringBuilder();}以上代码是异步接收数据的代码服务器端给我发送一次数据的时候这个方法走了两次是什么情况
很正常,tcp是基于流的,发送一次,多次接收,或者发送了多个小包,一次接收,都正常只要发送和接收双方约定好数据格式,做好数据拼包和分包就没有问题
解决方案八:
TCP是数据流,只管顺序正确不管批次,你以为的发一次数据不一定是收一次就全了,要自己拼接
解决方案九:
引用4楼l397870376的回复:
Quote: 引用3楼wyd1520的回复:
如果你发过来的包太长了,就分两次接收,这是正常的。我定义的是1024每次发送都小于1024
就算你定义2字节,也有可能1个1个的接收。。。
解决方案十:
引用8楼wyd1520的回复:
Quote: 引用4楼l397870376的回复:
Quote: 引用3楼wyd1520的回复:
如果你发过来的包太长了,就分两次接收,这是正常的。我定义的是1024每次发送都小于1024
就算你定义2字节,也有可能1个1个的接收。。。
我每次接收到的都是完整数据啊我解析出来的数据也是服务器发送的数据现在的问题是服务器发送一次数据我这接收两次而且两次都是完整的