我正在编写一个C#客户端来连接Node.JS服务器。事情很顺利,但有一次接收功能停止了工作。我能够确定访问客户端收到的字符串是冻结线程。一些代码摘录:
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
byte[] byteData = new byte[2048];
... setup socket connection ...
socket.BeginReceive(byteData, 0, byteData.Length,
SocketFlags.None, new AsyncCallback(OnReceive), null);
private void OnReceive(IAsyncResult ar)
{
socket.EndReceive(ar);
stringData = Encoding.ASCII.GetString(byteData).Trim();
Console.WriteLine("Before string");
Console.WriteLine(stringData);
Console.WriteLine("After string");
// always ready to asynchronously receive
socket.BeginReceive(byteData, 0, byteData.Length,
SocketFlags.None, new AsyncCallback(OnReceive), null);
}
接收' OK'来自Node.JS:
Before string
OK
甚至连控制台都没有写新线,因为系统输出在“OK”之后直接继续。在同一条线上。任何后续收到都没有显示。我不知道是什么导致了这一点,我似乎无法找到遇到此问题的其他人。
答案 0 :(得分:1)
socket.EndReceive
返回一个值,告诉您实际读取了多少字节。您需要获取该值并将其传递给GetString
方法:
int bytesRead = socket.EndReceive(ar);
stringData = Encoding.ASCII.GetString(byteData, 0, bytesRead);
否则,GetString
将尝试转换整个字符串。这会给你各种垃圾。您对Trim()
的现有调用正在删除由您当前正在执行该操作的方式导致的尾随空字节,但如果您传递部分填充的缓冲区,则不会阻止您获取垃圾到下一个电话。
那就是说,我什么都看不到会导致事情锁定。您确定自己没有更改代码的其他部分, 导致锁定吗?