c#下多线程的tcp粘包问题,请高手指点思路。
服务器端需要不断的向客户发送不同类型的数据,比如学生信息,老师信息,成绩信息等等不同的数据。因为信息比较多比较大,客户端收到几种不同数据,很难拆包....
现在服务端使用 beginSend发送,但是这个异步发送,无法保证顺序;更关键的时候,当一个学生信息分为10个包发送的时候,这10个包还没有发送到,已经有另外5个学生的信息(假如是5个包)又在beginSend发送。
这样,客户端收到的信息产生如下问题:
收到的信息次序混乱,因为不知道收到的包属于哪个类型,这个包是什么顺序等等。
都是类型一样的包(学生),客户端如果保证能正常处理这些包。
我现在的处理方法:
服务端发送数据的时候,使用了一个byte位作为标记类型,使用了4个byte位标记数据长度,使用了8个byte标记数据的唯一id,再使用一个byte标记包的数量。
这样我收到包的时候,先判断他的类型,然后找到他的唯一id,把唯一id的作为索引,继续接收同一个id 同一个类型的包,知道接收所有的包,然后合并。
但是现在我担心的问题是:
数据那边我使用了14个byte位来做标记 ,也就是byte[14]。但是在发送数据过程中,万一这14个byte字节被切断了,比如某一次只收到5个字节,但是后面的包有黏在一起,那怎么办?
或者是否有更好的解决方案?
问题有点复杂,谢谢!!!!!
现在服务端使用 beginSend发送,但是这个异步发送,无法保证顺序;更关键的时候,当一个学生信息分为10个包发送的时候,这10个包还没有发送到,已经有另外5个学生的信息(假如是5个包)又在beginSend发送。
这样,客户端收到的信息产生如下问题:
收到的信息次序混乱,因为不知道收到的包属于哪个类型,这个包是什么顺序等等。
都是类型一样的包(学生),客户端如果保证能正常处理这些包。
我现在的处理方法:
服务端发送数据的时候,使用了一个byte位作为标记类型,使用了4个byte位标记数据长度,使用了8个byte标记数据的唯一id,再使用一个byte标记包的数量。
这样我收到包的时候,先判断他的类型,然后找到他的唯一id,把唯一id的作为索引,继续接收同一个id 同一个类型的包,知道接收所有的包,然后合并。
但是现在我担心的问题是:
数据那边我使用了14个byte位来做标记 ,也就是byte[14]。但是在发送数据过程中,万一这14个byte字节被切断了,比如某一次只收到5个字节,但是后面的包有黏在一起,那怎么办?
或者是否有更好的解决方案?
问题有点复杂,谢谢!!!!!
...全文
相关推荐
C# TCP粘包解决
完美解决粘包!!值不值你说了算
C# TCP客户端多线程处理:从粘包到UI卡死的完整解决方案
在工业上位机、设备通信以及服务器对接等场景中,TCP客户端始终是数据交互的核心入口。TCP本身是字节流协议,消息边界与粘包半包问题往往伴随着多线程并发和界面响应卡顿等工程挑战。理解阻塞接收、线程安全队列、跨线程UI更新等基础原理,是构建稳定通信框架的前提。通过生产者-消费者模型将接收、解析与显示解耦,既能避免Receive阻塞拖垮界面,也能在高并发下保证数据不丢失。无论对接扫码枪、PLC还是自建压测工具,掌握连接数量规划、端口占用与断线重连技术,都能有效提升系统的可靠性。本文从这些通用技术概念出发,完整呈现
C#实现Socket编程 (异步通讯,解决Tcp粘包)第三阶段
C#实现Socket编程 (异步通讯,解决Tcp粘包)
unity实现Socket通讯(内含tcp粘包/拆包解决)
通过socket通讯实现服务器与客户端的连接。首先服务器利用udp广播发送自己的ip地址,客户端在收到广播后通过此ip以tcp连接的方式连接服务器来通讯。
C#基于TCP的Socket多线程通信(包含服务端和客户端)
C#基于TCP的Socket多线程通信(包含服务端和客户端) 代码都有注释,方便新手阅读


