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

