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

在C#中如何区分TCP字节的不同用途,实现服务端精准识别

C# TCPClient 通信字节功能标记实现方案

核心思路是自定义应用层消息帧结构,提前约定好每个位置字节的含义,服务端按约定解析即可直接识别对应功能,具体实现如下:

通用消息帧约定

你可以根据业务需求自定义最简的固定帧结构,参考示例:

  • 第1个字节:功能类型标记,直接对应业务用途,比如约定0x01=登录请求、0x02=心跳包、0x03=业务数据上报、0x04=错误响应,预留0x00、0xFF等取值做后续扩展
  • 第2~3个字节:负载长度,用ushort类型存储后续业务数据的字节长度,同时解决TCP粘包拆包问题
  • 第4个字节开始:业务负载数据,对应功能类型的具体内容,比如登录请求的账号密码、业务上报的传感器数据等
  • (可选)末尾1~2个字节:校验位,存异或校验/CRC校验值,不可靠网络下可用来校验数据完整性

客户端发送代码示例

// 1. 构造各段数据
byte funcType = 0x01; // 标记为登录请求
string account = "test_user";
string password = "test_pass";
byte[] payload = System.Text.Encoding.UTF8.GetBytes($"{account}|{password}");
ushort payloadLength = (ushort)payload.Length;

// 2. 拼接完整消息帧
byte[] fullMessage = new byte[3 + payloadLength];
fullMessage[0] = funcType;
// 统一转网络字节序(大端)避免跨架构解析异常
BitConverter.GetBytes(System.Net.IPAddress.HostToNetworkOrder((short)payloadLength)).CopyTo(fullMessage, 1);
payload.CopyTo(fullMessage, 3);

// 3. 发送
using TcpClient client = new TcpClient("127.0.0.1", 8888);
using NetworkStream stream = client.GetStream();
await stream.WriteAsync(fullMessage, 0, fullMessage.Length);

服务端识别解析示例

TcpListener listener = new TcpListener(System.Net.IPAddress.Any, 8888);
listener.Start();
while (true)
{
    TcpClient client = await listener.AcceptTcpClientAsync();
    _ = ProcessClient(client); // 异步处理客户端连接避免阻塞
}

async Task ProcessClient(TcpClient client)
{
    using (client)
    using (NetworkStream stream = client.GetStream())
    {
        byte[] headerBuffer = new byte[3];
        // 读固定长度的消息头
        await stream.ReadExactlyAsync(headerBuffer, 0, 3);
        
        byte funcType = headerBuffer[0];
        // 转主机字节序解析长度
        ushort payloadLength = (ushort)System.Net.IPAddress.NetworkToHostOrder(BitConverter.ToInt16(headerBuffer, 1));
        
        byte[] payloadBuffer = new byte[payloadLength];
        await stream.ReadExactlyAsync(payloadBuffer, 0, payloadLength);

        // 直接根据功能标记走对应处理逻辑
        switch (funcType)
        {
            case 0x01:
                string content = System.Text.Encoding.UTF8.GetString(payloadBuffer);
                string[] accountInfo = content.Split('|');
                // 执行登录校验逻辑
                break;
            case 0x02:
                // 回复心跳响应
                break;
            // 其他功能类型对应处理
        }
    }
}

注意事项

  • 如果业务场景的功能类型超过255种,可以把功能标记的长度扩展为2字节,最多支持65536种不同功能
  • 所有端的消息帧约定必须严格统一,一旦上线后修改协议要做向下兼容处理
  • 如果需要传输大文件或者超大业务数据,可以在消息头额外加分片标记、分片序号字段实现分片传输

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:57:03