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

C# 如何通过TCP向TCPListener发送用户名、时间及消息数据

TCP聊天消息结构化传输解决方案

针对你遇到的分隔符冲突问题,这里提供3种不同复杂度的落地思路,可根据你的项目需求选择:

方案1:自定义长度帧(最简单,无额外依赖)

TCP是字节流协议,你可以自行定义固定的帧头来区分字段,不需要依赖序列化库,完全规避分隔符冲突问题:

  • 帧结构设计:每个消息前先写4个固定长度的字段长度,依次为用户名长度->用户名内容->时间戳长度->时间戳内容->消息长度->消息内容
  • 发送端逻辑示例(Python伪代码):
import struct
username = "user1"
timestamp = "2024-05-20 12:00:00"
content = "Hello:world" # 消息内容可任意包含特殊字符,不会产生冲突

# 打包成字节流
byte_data = struct.pack('!I', len(username)) + username.encode('utf-8')
byte_data += struct.pack('!I', len(timestamp)) + timestamp.encode('utf-8')
byte_data += struct.pack('!I', len(content)) + content.encode('utf-8')

# 提前发送整个消息的总长度,解决TCP粘包问题
total_len = len(byte_data)
send_data = struct.pack('!I', total_len) + byte_data
sock.sendall(send_data)
  • 接收端逻辑:先读取4字节拿到整个消息的总长度,按长度收完所有数据后,依次读取4字节获取用户名长度、读取对应长度的用户名内容,再按相同逻辑读取时间戳、消息内容即可。

优势:无第三方依赖、实现简单、性能高,完全不需要考虑特殊字符的转义问题,适合小型终端聊天工具使用。

方案2:JSON序列化(最通用,调试方便)

直接把三个字段拼装成字典/对象,序列化成JSON字符串后传输,同样可以规避分隔符问题:

  • 发送端逻辑:把{"username":"xxx", "timestamp":"xxx", "content":"xxx"}转成JSON字符串,再转成字节流,同样提前发送总长度再传输内容,避免粘包。
  • 接收端逻辑:收完完整字节流后反序列化成对象,直接读取对应字段即可。

优势:结构清晰,调试时直接打印就能看到明文内容,后续新增字段(比如消息类型、@用户标记)不需要大幅修改传输逻辑,适合快速开发。
注意:不要直接用换行符分割JSON字符串,还是要提前传输总长度,避免单个JSON内容自带换行导致拆分错误。

方案3:二进制序列化库(性能最优,适合后续扩展)

如果后续要扩展更复杂的功能,比如发文件、发语音消息,可以用Protobuf、MessagePack这类二进制序列化框架,提前定义好消息结构体,框架会自动处理序列化和反序列化,不需要自己手动拼接字节。

优势:序列化后的体积比JSON小30%以上,解析速度更快,字段变更兼容性好,适合中大型项目使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 17:27:03