【发布时间】:2019-02-27 17:30:51
【问题描述】:
我正在编写一个 TCP 服务器来打开一个端口并与一些仅将字符串数据作为字节数组发送的硬件通信。
环境在 Unity 中,所以我使用异步回调以避免阻塞程序。这似乎工作正常,连接有效,遇到正确的数据,我可以向硬件发送消息,但套接字缓冲区永远不会清除。当我执行Socket.EndReceive(ar) 时,数据只会堆积起来,不会清空。
异步循环如何工作?我不明白为什么这段代码没有完成循环并清除缓冲区。我花了很多时间试图理解这个过程,但无法弄清楚为什么这段代码不应该工作。
protected TcpListener ListenServer;
protected Socket SimNetSocket;
protected byte[] ReadBuffer = new byte[1024];
protected string MessageBuffer;
[....] [....]
public void BeginReceive()
{
SimNetSocket.BeginReceive(ReadBuffer, 0, ReadBuffer.Length, SocketFlags.None, EndReceive, null);
}
protected void EndReceive(IAsyncResult async)
{
string msg = "";
try { msg = ByteArrayToString(ReadBuffer); }
catch (Exception e) { Debug.LogError(e); }
Debug.Log("RAW RECEIVE: " + msg);
MessageBuffer += msg;
ReadBuffer = new byte[1024];
SimNetSocket.EndReceive(async);
BeginReceive();
}
MessageBuffer 是一个堆栈,稍后在处理消息的更新循环中被清除,与套接字上的ReadBuffer 复合问题无关。
同样,连接有效(代码未显示)并且通信确实有效。我可以看到数据成功地从双方传来传去,但我无法控制另一端硬件在做什么。是否需要一些实现来接收这些调用并确认缓冲区可以清除?
我实际看到的是硬件发送一条消息,然后是另一条消息,它堆积在它的最后一条消息上,一次又一次,一次又一次。不过,我正在通过上面的代码处理每条消息。所以我很困惑。
【问题讨论】:
-
EndReceive的问题已经注意到了;而且:您使用的是什么文本编码?如果它不是 ASCII,你会有更大的问题 - 请参阅我对其中一个答案的评论
-
调用构造函数是清除缓冲区:ReadBuffer = new byte[1024];