问题描述
客户端向服务端通过GPRS发送数据的时候,客户端发送的是一个数据包,但是服务端接受的时候发现那个数据包被分成两个子数据包。但是相同的数据包客户端通过其他方式发给服务端时,服务端能够接受一个完整的数据包。请问一下这个是什么原因。谢谢!
解决方案
解决方案二:
面向连接的tcp,本来就是如此的。如果你不理解为什么会分包、粘包,那你就使用更为简单的可靠的http(它是tcp上更为可靠的实现)。
解决方案三:
你所谓的数据包,是应用程序的数据包,跟底层的数据包是两回事(有些人总把tcp底层协议的数据包概念来说成是应用程序数据包)。比如说你一次性地发10k内容,底层分15个还是25个数据包发送,每个包走什么路由,这是不确定的。tcp只保证在接收端的数据顺序(因此如果中间有丢包,就会重传),并且你从应用程序tcp缓冲区中可以陆续读取到这些数据。
解决方案四:
如果你想使用比较底层的数据包概念,那么你就应该使用udp。它显然比tcp更快(因为它采用了比较流氓的通讯手法,它不会在网络堵塞时主动减慢发送速度),而且它是你的那种“数据包”概念——接收端接受到整个数据包。不过udp是不可靠通讯。再稍微复杂一点的网络上,以及大部分路由器上,都经常会自动丢弃udp数据。
解决方案五:
粘包处理仅供参考
解决方案六:
需要有一个数据缓冲区来处理这个问题参考我之前的帖子
解决方案七:
楼上都介绍的很详细了,就围绕粘包这个问题展开研究就可以了。
解决方案八:
引用5楼SomethingJack的回复:
需要有一个数据缓冲区来处理这个问题参考我之前的帖子
如果接收的数据包头是0xaa,然后中间也有数据是0xaa,这个应该怎么办?
解决方案九:
这就是数据传输时的协议问题了传输时,不但要有标识开始和结束的标记,还要有数据的长度。除非首尾标记不会出现在正文中引用7楼PiggyZhu1024的回复:
Quote: 引用5楼SomethingJack的回复:
需要有一个数据缓冲区来处理这个问题参考我之前的帖子如果接收的数据包头是0xaa,然后中间也有数据是0xaa,这个应该怎么办?
解决方案十:
TCP通讯用起来简单,其实内部实现很复杂的,由于是可靠连接,为了保证数据准确性,其他方面自然要作牺牲.比如一次发送会需要接收几次才收全,或者多次发送的数据会连在一起.
解决方案十一:
这么多大神已经把这个问题解答得相当透彻了,你应该明白了吧
解决方案十二:
我猜测是不是客户端发送出去的时候,底层已经将数据分成2个包了?因为服务器接收时除非是非常底层的代码才有可能出现LZ所说的情况,.NET的类库遇到这种情况也会等到一个包传输完整才会回调的