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

Unity客户端NetworkStream接收消息为空,调试模式运行正常问题咨询

问题诱因
  1. 核心错误是异步读取的时序处理错误
    BeginRead 是异步非阻塞API,调用后会立刻返回继续执行后续代码,不会等待网络数据接收完成。你在客户端的 DefaultConnectCallback 方法中,调用 networkStream.BeginRead 后直接对 data 数组做解码操作,此时异步读取还没执行,data 是刚初始化的全零数组,解码出来自然是空字符串。
    Debug模式下能正常运行属于巧合:Debug模式运行速度远低于Release模式,如果你加了断点还会主动阻塞执行流程,刚好给了异步读取足够的时间完成数据写入,此时读取data刚好能拿到内容,不是逻辑正确的稳定表现。

  2. 其他潜在错误

  • 客户端 DefaultReadCallback 中没有接收 EndRead 的返回值(实际读取到的字节长度),直接解码整个1024长度的数组,即使时序调整正确也会读到大量冗余空字符,你当前用 Trim('\0') 只是临时兼容方案,不是规范实现。
  • 服务端 BeginWrite 传入的回调函数笔误,写的是 DefaultReadCallback,应该对应你定义的 DefaultWriteCallback,当前逻辑下不影响单次消息发送,后续扩展逻辑会触发异常。
修复示例(客户端核心代码)
private void DefaultConnectCallback(IAsyncResult ar)
{
    TcpClient client = (TcpClient)ar.AsyncState;
    networkStream = client.GetStream();
    data = new byte[1024];
    // 异步读的结果处理全部放在ReadCallback中
    networkStream.BeginRead(data, 0, data.Length, DefaultReadCallback, networkStream);      
}

private void DefaultReadCallback(IAsyncResult ar)
{
    NetworkStream networkStream = (NetworkStream)ar.AsyncState;
    // 拿到实际读取到的字节长度
    int readLen = networkStream.EndRead(ar);
    // 只解码实际读到的字节
    string stringData = System.Text.Encoding.ASCII.GetString(data, 0, readLen);
    Log.LogMessage("Recieved a message");
    Log.LogMessage(stringData);
    Log.LogMessage($"{stringData.Length}");   
    // 如果需要持续接收消息,在这里再次调用BeginRead即可
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 03:15:01