C#开发异步TCP客户端无法接收服务端消息问题咨询
你的代码有三个核心问题导致接收不到消息,不需要手动循环调用Receive函数,你现有的异步回调链式调用逻辑本身就可以实现持续监听:
- 第一个问题:
Receive调用时机错误。BeginConnect是异步方法,调用后会立即返回,不会等待连接建立完成。你在StartClient里调用完BeginConnect立刻执行Receive(client),此时 socket 还未完成连接,BeginReceive根本不会生效。 - 第二个问题:日志输出逻辑错误。你当前的
ReceiveCallback只有当bytesRead == 0也就是服务端主动断开连接时,才会将收到的内容写入日志。如果服务端只是发消息不断开,你收到的内容会一直存在StringBuilder里,永远不会打印到文本框。 - 第三个问题:
StartClient末尾的那行输出代码完全无效。BeginReceive是异步操作,调用后会立即返回,此时response还没有被赋值,你读到的永远是空字符串。
解决步骤
- 把
StartClient里的Receive(client)调用删掉,移到ConnectCallback中,确认连接成功后再启动接收:
void ConnectCallback(IAsyncResult ar) { try { Socket client = (Socket)ar.AsyncState; client.EndConnect(ar); WriteOnLog("Socket connected to " + client.RemoteEndPoint.ToString()); // 连接成功后再启动接收 Receive(client); } catch (Exception e) { WriteOnLog(e.ToString()); } }
- 修改
ReceiveCallback的输出逻辑,你可以根据自己的业务协议判断完整消息边界,测试场景下可以每次收到数据就打印:
void ReceiveCallback(IAsyncResult ar) { try { StateObject state = (StateObject)ar.AsyncState; Socket client = state.workSocket; int bytesRead = client.EndReceive(ar); if (bytesRead > 0) { string part = Encoding.ASCII.GetString(state.buffer, 0, bytesRead); state.sb.Append(part); // 这里可以加自己的业务判断,比如是否收到消息结束符\n之类的 WriteOnLog("收到服务端消息:" + part); // 继续下一次接收,该逻辑本身就实现了持续监听,不需要额外循环 client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state); } else { if (state.sb.Length > 1) { string Response = state.sb.ToString(); WriteOnLog("服务端断开连接,最终收到的完整消息:" + Response); } } } catch (Exception e) { WriteOnLog(e.ToString()); } }
- 删掉
StartClient末尾那行无效的WriteOnLog("Response received : " + response.ToString());代码。
内容的提问来源于stack exchange,提问作者AlexMacabu
相关产品推荐
相关产品推荐

