Socket 通信 接收的数据包被分为多个

问题描述

客户端向服务端通过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的类库遇到这种情况也会等到一个包传输完整才会回调的

时间: 2025-01-25 16:08:08

Socket 通信 接收的数据包被分为多个的相关文章

byte-C#中socket通信需要将数据按包头和定长分割,如何做

问题描述 C#中socket通信需要将数据按包头和定长分割,如何做 包头是0x55,每个数据加上包头为11个byte,但是数据中也可能出现0x55,该如何分割 解决方案 一般的解决方法是两种: 1)定义转义符,对内容中的 0x55 进行转义.如将 0x55 转义成 0x54 01;则 0x54 是 0x54 00:用两个字节表示: 2)定义包头后带数据的长度,再加上包尾,最好再加上一个校验位.这样在接收到一包数据后,先按上述定义进行有效性验证. 解决方案二: 包头后面带上长度信息,按长度去截取啊

vbnet-VB.NET中如何处理串口通信接收的数据?

问题描述 VB.NET中如何处理串口通信接收的数据? 现在上位机的代码如下: Private Sub comm_DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs) Dim n As Integer = comm.BytesToRead Dim buf(n) As Byte comm.Read(buf, 0, n) builder.Length = 0 Invoke(Sub() If checkB

大家谁有Fortran程序和其他程序语言socket通信,实现数据交换的例子?

问题描述 大家谁有Fortran程序和其他程序语言socket通信,实现数据交换的例子? 大家谁有Fortran程序和其他程序语言socket通信,实现数据交换的例子? 解决方案 用c去实现网络通讯,fortran去调用 http://blog.chinaunix.net/uid-21498513-id-143992.html 解决方案二: http://blog.chinaunix.net/uid-21498513-id-143992.html

android socket通信读取图片数据,数据出错

问题描述 android socket通信读取图片数据,数据出错 我从电脑服务端用imageIO发送了屏幕的截图给android,android端发现如果每次读取 的数据大小超过20K,所得的数据就会出错,我对比了下发送前的图片数据,基本上是 夹杂了很多1K以上的0数据块,又或者是数据块错位.但是一旦把每次读取的数据大小降 低至10K以下又或者增加两次读取间的间隔至500ms以上就能保持数据不出错,这是为什 么呢? 解决方案 Android中的Http通信(二)之根据Url读取网络数据 解决方案

Java Socket通信(一)之客户端程序 发送和接收数据_java

网络应用分为客户端和服务端两部分,而Socket类是负责处理客户端通信的Java类.通过这个类可以连接到指定IP或域名的服务器上,并且可以和服务器互相发送和接受数据. 对于Socket通信简述,服务端往Socket的输出流里面写东西,客户端就可以通过Socket的输入流读取对应的内容.Socket与Socket之间是双向连通的,所以客户端也可以往对应的Socket输出流里面写东西,然后服务端对应的Socket的输入流就可以读出对应的内容. 例1:客户端的简略写法(一). Socket clien

socket通信inputStream.read(byte)读取速度小于接收速度,导致多帧数据叠加在一起。

问题描述 在socket通信中,由于inputStream.read(byte)是尽可能的读byte[]大小的数据,当服务端发送数据速度大于客户端读取数据的速度时,就会出现客户端读到多帧连在一起的报文.而这些发送数据,读取数据的速度是未知的.怎么解决这个问题,服务器端不能改变, 解决方案 解决方案二:想办法将读取的后续动作的耗时降低.比如读取动作只负责读取,读取的内容传给多线程进行处理.解决方案三:没用.....解决方案四:想到了一个办法,把所有读的数据放到一起,不管每次读的是多少,放在所接收数

java使用Socket类接收和发送数据_java

网络应用分为客户端和服务端两部分,而Socket类是负责处理客户端通信的Java类.通过这个类可以连接到指定IP或域名的服务器上,并且可以和服务器互相发送和接受数据.在本文及后面的数篇文章中将详细讨论Socket类的使用,内容包括Socket类基础.各式各样的连接方式.get和set方法.连接过程中的超时以及关闭网络连接等. 在本文中,我们将讨论使用Socket类的基本步骤和方法.一般网络客户端程序在连接服务程序时要进行以下三步操作. 连接服务器 发送和接收数据 关闭网络连接 一.连接服务器 在

C# socket networkstream 接收数据

问题描述 C# socket networkstream 接收数据 最近在做c/s,客户端用C#的Socket进行通信.接收数据开单独的接收线程使用networkstream进行接收接收的方法大体上跟网上流传的一样do{ int readSize = mNetworkstream.Read(bytes 0 1024); if (readSize > 0) { //do sth }}while(mNetworkstream.DataAvailable) 这样接收局内网或者单机没问题,但是放到外网测

Android socket通信,数据读取。

问题描述 Android socket通信,数据读取. public class ChatRoom extends ActionBarActivity { protected TextView tv_chat_show; protected EditText ed_chat_input; protected Button btn_send; protected ActionBarActivity that; protected String receiverMsg; protected Stri