C# 异步客户端-访问字符串冻结接收线程
我正在编写一个C#客户端来连接Node.JS服务器。一切正常,但接收功能一度停止工作。我能够确定访问客户端接收的字符串是冻结线程。一些代码摘录:C# 异步客户端-访问字符串冻结接收线程,c#,multithreading,node.js,sockets,C#,Multithreading,Node.js,Sockets,我正在编写一个C#客户端来连接Node.JS服务器。一切正常,但接收功能一度停止工作。我能够确定访问客户端接收的字符串是冻结线程。一些代码摘录: Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); byte[] byteData = new byte[2048]; ... setup socket connection ... socket.BeginRece
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);
}
当从Node.JS接收到“OK”时,将输出以下内容:
Before string
OK
而且换行符甚至不是由控制台编写的,因为系统输出直接在同一行的“OK”之后继续。任何后续接收都不会显示任何内容。我不知道这可能是什么原因造成的,而且我似乎找不到任何其他遇到此问题的人。
socket.EndReceive
返回一个值,告诉您实际读取了多少字节。您需要获取该值并将其传递给GetString
方法:
int bytesRead = socket.EndReceive(ar);
stringData = Encoding.ASCII.GetString(byteData, 0, bytesRead);
否则,GetString
将尝试转换整个字符串。那会给你带来各种各样的垃圾。您对Trim()
的现有调用正在删除由当前执行方式导致的尾随nul字节,但如果将部分填充的缓冲区传递给下一个调用,这不会阻止您获得垃圾
也就是说,我看不到会导致锁死的东西。您确定没有更改代码的其他部分,这导致了锁定吗?是的,我确定这不是代码的另一部分,因为我使用了
git reset--hard HEAD
,问题仍然存在。这让我怀疑Node.JS端是否存在问题,但我看不出这会对客户端产生什么影响。编辑:使用bytesRead
修复它。我不知道为什么它以前有效,现在不行,但我很感激它的解决办法。@BenJuan26:很高兴它解决了你的问题。知道缓冲区中有什么东西会很有趣。我的假设是,转换整个2048个字符的缓冲区会导致某些字符的输出出现长时间延迟。例如,如果您创建一个由2048个BEL
字符(chr(7)
)组成的字符串,然后将其输出,计算机将发出2048次单独的蜂鸣声。这需要很长时间。