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

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; 
    // 后续代码...
}

下一步验证步骤

  1. 先修复SendDataToServer的冗余包装问题,这是最可能解决问题的点;
  2. 给服务器端的登录处理代码加日志,确认它是否正确解析数据包,是否发送了响应;
  3. 可以用本地抓包工具查看实际的网络数据,确认客户端发送的数据包格式是否正确,以及服务器有没有返回数据。

内容的提问来源于stack exchange,提问作者Dennis de Bruijn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:17:51