在我的“客户端”中,我有以下代码:
socket.Send(ASCIIEncoding.UTF8.GetBytes("Test0"), SocketFlags.None);
socket.Send(ASCIIEncoding.UTF8.GetBytes("Test1"), SocketFlags.None);
socket.Send(ASCIIEncoding.UTF8.GetBytes("Test2"), SocketFlags.None);
Run Code Online (Sandbox Code Playgroud)
在我的“服务器”中,我有以下内容:
public void ReadCallback(IAsyncResult ar)
{
StateObject state = (StateObject)ar.AsyncState;
Socket handler = state.WorkSocket;
int read = handler.EndReceive(ar);
if (read > 0)
{
string aux = Encoding.ASCII.GetString(state.buffer, 0, read);
//Rest of the code...
Run Code Online (Sandbox Code Playgroud)
我的问题是: aux 是“Test0Test1Test2”...我原以为我的 ReadCallback 会被调用 3 次,每个send
调用一次...但它只被调用一次...我必须做些什么才能使 readcallback 起作用正如我所料?
您似乎正在使用流类型套接字(例如 TCP 而不是 UDP)。
流套接字是流 - 接收者不一定能判断消息是通过多次发送还是单次发送发送的。
如果您需要分离消息,您需要使用面向数据包或面向消息的协议,或者实现您自己的显示消息开始和结束位置的方法。
我只会回应 Ben 所说的,并尝试添加一点额外的信息。我在 5-6 年前遇到了同样的情况,并尽可能多地进行了研究,得出的结论是“事情就是这样”。这是我或多或少证实的唯一“参考”:
http://www.xtremevbtalk.com/archive/index.php/t-204348.html
所以我所做的是在每个数据包前面加上数据包的长度,并在另一端“解析”接收到的数据包。