C# TCP/IP游戏客户端发送登录包后接收0字节问题求助
游戏客户端发送登录包后收到0字节数据的排查方案
嘿,我来帮你捋捋这个问题!你说客户端点登录发完包后,就收到0字节数据触发断开提示,但服务器明明收到了登录包,对吧?咱们一步步拆解问题,先看看你的代码细节:
你的相关代码片段
客户端发送数据方法
public void SendDataToServer(byte[] data) { ByteBuffer buffer = new ByteBuffer(); buffer.WriteBytes(data); m_Network.MyStream.Write(buffer.ToArray(), 0, buffer.ToArray().Length); buffer = null; }
客户端接收回调
private void OnReceive(IAsyncResult result) { if (PlayerSocket != null) { if (PlayerSocket == null) return; int byteArray = MyStream.EndRead(result); m_CurrentBytes = null; Array.Resize(ref m_CurrentBytes, byteArray); Buffer.BlockCopy(m_ASyncBuffer, 0, m_CurrentBytes, 0, byteArray); if (byteArray == 0) { Debug.Log("You got disconnected from the Server."); PlayerSocket.Close(); return; } m_ShouldHandleData = true; if (PlayerSocket == null) return; MyStream.BeginRead(m_ASyncBuffer, 0, 8192, OnReceive, null); } }
登录包发送代码
public void SendLoginPacket() { int ID = int.Parse(m_InputField.text); ByteBuffer byteBuffer = new ByteBuffer(); byteBuffer.WriteInteger(1200); //Test login packet ID byteBuffer.WriteFloat(12); //Test if it receives m_Network.m_ClientSendData.SendDataToServer(byteBuffer.ToArray()); }
核心问题排查&解决思路
1. 发送环节的冗余包装导致数据包格式错误(最可能原因)
你看,在SendLoginPacket里已经用ByteBuffer构建好了完整的登录包字节数组,但传到SendDataToServer后,又被塞进了另一个ByteBuffer再发送!这就相当于你给登录包多套了一层不必要的缓冲区结构,服务器收到的是完全不符合预期的数据包,大概率解析失败后直接断开了客户端连接,这就导致客户端收到0字节的断开信号。
修复方案:直接发送传入的原始数据,去掉多余的ByteBuffer包装,同时加上Flush()确保数据立即发送:
public void SendDataToServer(byte[] data) { if(data == null || data.Length == 0) return; m_Network.MyStream.Write(data, 0, data.Length); m_Network.MyStream.Flush(); // 强制把缓冲区数据发送出去 }
2. 服务器未返回响应或主动断开连接
既然服务器确实收到了数据包,那要检查服务器端的登录包处理逻辑:
- 服务器是否正确解析了收到的数据包?如果格式错误,会不会直接关闭连接?
- 处理完登录请求后,服务器有没有给客户端返回响应数据包?如果服务器只收不发,且超时后主动断开,客户端也会收到0字节的结果。
3. 客户端接收代码的小优化(非直接原因)
你在OnReceive开头的双重判断if (PlayerSocket != null)+if (PlayerSocket == null) return;是冗余的,可以简化成:
private void OnReceive(IAsyncResult result) { if (PlayerSocket == null) return; // 后续代码... }
下一步验证步骤
- 先修复
SendDataToServer的冗余包装问题,这是最可能解决问题的点; - 给服务器端的登录处理代码加日志,确认它是否正确解析数据包,是否发送了响应;
- 可以用本地抓包工具查看实际的网络数据,确认客户端发送的数据包格式是否正确,以及服务器有没有返回数据。
内容的提问来源于stack exchange,提问作者Dennis de Bruijn
相关产品推荐
相关产品推荐

