You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#开发异步TCP客户端无法接收服务端消息问题咨询

你的代码有三个核心问题导致接收不到消息,不需要手动循环调用Receive函数,你现有的异步回调链式调用逻辑本身就可以实现持续监听:

  • 第一个问题:Receive 调用时机错误。BeginConnect 是异步方法,调用后会立即返回,不会等待连接建立完成。你在 StartClient 里调用完 BeginConnect 立刻执行 Receive(client),此时 socket 还未完成连接,BeginReceive 根本不会生效。
  • 第二个问题:日志输出逻辑错误。你当前的 ReceiveCallback 只有当 bytesRead == 0 也就是服务端主动断开连接时,才会将收到的内容写入日志。如果服务端只是发消息不断开,你收到的内容会一直存在 StringBuilder 里,永远不会打印到文本框。
  • 第三个问题:StartClient 末尾的那行输出代码完全无效。BeginReceive 是异步操作,调用后会立即返回,此时 response 还没有被赋值,你读到的永远是空字符串。

解决步骤

  1. 把 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());
    }
}
  1. 修改 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());
    }
}
  1. 删掉 StartClient 末尾那行无效的 WriteOnLog("Response received : " + response.ToString()); 代码。

内容的提问来源于stack exchange,提问作者AlexMacabu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 16:48:03