我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python数据传输黏包问题

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python数据传输黏包问题

1.socket黏包问题原理

黏包:指数据与数据之间没有明确的分界线,导致不能正确的读取数据。

应用数据想要发送数据就必须将数据交给操作系统,而操作系统需要同时为所有的应用程序提供数据传输服务,就意味着不可能马上将应用数据发送,就需要为程序提供一个缓冲区,用于临时存放数据。

当发送数据很快,有两条数据都在缓冲区时,操作系统可能将两个数据发给接收方,数据之间没有分界线,接收方会误认为是一条数据。

2.UDP协议

UDP在收发数据时是基于数据包的,即一个包一个包的发送,包与包之间有明确的分界,到达对方缓冲区后也是独立数据包。这种方式存在的问题:

①发送数据的长度每个操作系统会有不同的限制,数据超过限制则无法发送;

②接收方接收数据时,如果应用程序提供的缓存容量小于数据包的长度,则会造成数据的丢失,而缓冲区大小不可能无限大。

这意味着UDP不会出现黏包问题,但会丢失数据,不可靠。

3.TCP协议

TCP增加了一套校验规则来保证数据的完整性,会将超过TCP包最大长度的数据拆分为多个TCP包,并在传输数据时为每一个TCP数据包指定一个顺序号,接收方在收到TCP数据包后按照顺序将数据包进行重组,重组后的数据全都是二进制数据,且每次收到的二进制数据之间没有明显的分界。基于这种工作机制,TCP在三种情况下发生黏包问题:

①当单个数据包较小时,接收方可能一次性读取了多个包的数据;

②当整体数据较大时,接收方可能一次性仅读取了一个包的一部分内容;

③另外TCP协议为提高效率,增加了一种优化机制,会将数据小且发送间隔短的数据合并发送,该机制也会导致发送方将两个数据包粘在一起发送。

也就是说,TCP传输数据是可靠的,但是会黏包。

4.发送方出现的黏包

服务器端:

from socket import *
server_socket = socket(AF_INET,SOCK_STREAM)
server_socket.bind(('',8080))
server_socket.listen(5)
 
new_socket,client_addr = server_socket.accept()
 
data1 = new_socket.recv(1024)
data2 = new_socket.recv(1024)
print("收到的第一条数据:",data1)
print("收到的第二条数据:",data2)
 
new_socket.close()
server_socket.close()

客户端:

from socket import *
 
client_socket = socket(AF_INET,SOCK_STREAM)
client_socket.connect(('10.175.193.126',8080))
client_socket.send('hello'.encode('utf-8'))
client_socket.send('word'.encode('utf-8'))
client_socket.close()

服务器端接收到的数据:

由于客户端两条数据发送间隔太短且数据包太小,被服务器端误认为是一条数据。

5. 接收方出现的黏包

服务器端:

from socket import *
import time
 
server_socket = socket(AF_INET,SOCK_STREAM)
server_socket.bind(('',8080))
server_socket.listen(5)
 
new_socket,client_addr = server_socket.accept()
print("连接成功!",client_addr)
 
data1 = new_socket.recv(3) #每次只接收三个字节,接收不完整
time.sleep(6)
print("收到的第一条数据:",data1)
 
data2 = new_socket.recv(10)
#接收第一次未接收的数据,若有空间,会继续接收新数据
print("收到的第二条数据:",data2)
 
new_socket.close()
server_socket.close()

客户端:

from socket import *
#通过time模块使客户端发送多个数据包时,时间间隔变长
import time
 
client_socket = socket(AF_INET,SOCK_STREAM)
client_socket.connect(('10.175.193.126',8080))
client_socket.send('hello'.encode('utf-8'))
time.sleep(5) #让当前线程休眠5秒
client_socket.send('word'.encode('utf-8'))
 
client_socket.close()

服务器端接收到的数据:

6.黏包的成因

①服务器端出现黏包:接收方不知道消息之间的界限,不知道一个消息要提取多少字节的数据造成的;

②客户端出现黏包:TCP在发送数据少且间隔时间短的数据包时,会将几条合并一起发送。

到此这篇关于Python数据传输黏包问题的文章就介绍到这了,更多相关Python数据传输黏包内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python数据传输黏包问题

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python数据传输黏包问题怎么解决

本篇内容主要讲解“Python数据传输黏包问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python数据传输黏包问题怎么解决”吧!1.socket黏包问题原理黏包:指数据与数据之间没
2023-06-30

Python Socket通信黏包问题分

参考:http://www.cnblogs.com/Eva-J/articles/8244551.html#_label51.黏包的表现(以客户端远程操作服务端命令为例)注:只有在TCP协议通信的情况下,才会产生黏包问题基于TCP协议实现的
2023-01-30

java中json传输数据乱码问题

java中json传输数据乱码问题解决方法:(推荐:java视频教程)1、对参数先进行ISO-8859-1编码,再以utf-8解码 @RequestMapping(method=RequestMethod.GET) @ResponseBody
java中json传输数据乱码问题
2020-09-05

python一行输入n个数据问题

这篇文章主要介绍了python一行输入n个数据问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-05-19

win10强迫同意数据传输问题怎么解决

如果您不想同意Windows 10中的数据传输选项,您有几种选择来解决这个问题:选择不同意:当出现数据传输选项时,您可以选择不同意,这样Windows 10将不会收集您的数据。请注意,某些功能可能受到限制或无法正常工作。自定义数据传输设置:
2023-10-26

python使用tcp传输图片数据

本文实例为大家分享了python使用tcp传输图片数据的具体代码,供大家参考,具体内容如下 数据包格式如下客户端:import socket import sysHOST,PORT = "172.18.0.3",19984def main(
2022-06-02

Python中的函数参数传递问题

这篇文章主要介绍了Python中的函数参数传递问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-01-04

java fastjson传输long数据接收到了int的问题怎么解决

这篇“java fastjson传输long数据接收到了int的问题怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“j
2023-06-26

云服务器包括数据库吗为什么没有数据传输

云服务器是一种虚拟的云平台,它们提供了一个存储和计算资源池,其中的数据存储和处理都是通过网络进行的,因此不需要借助服务器。在一些情况下,云服务器可能是一个数据库,但实际上它只是服务器上的一个资源池,需要通过网络传输数据到云服务器中进行处理。但是,如果您已经安装了数据库服务器,并且需要向其传输数据,则必须要注意以下几点:确保您选择的云服务器提供商已经配置了您的数据库管理系统,以便您可以使用它
2023-10-26

python中网络通信数据传输的示例

这篇文章给大家分享的是有关python中网络通信数据传输的示例的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。python实现网络通信数据传输前言基础知识学习一、OSI 模型二、TCP、IP协议族:三、python
2023-06-06

Python爬虫抓取手机APP的传输数据

大多数APP里面返回的是json格式数据,或者一堆加密过的数据 。这里以超级课程表APP为例,抓取超级课程表里用户发的话题。 1、抓取APP数据包 方法详细可以参考这篇博文:Fiddler如何抓取手机APP数据包 得到超级课程表登录的地址:
2022-06-04

云服务器包括数据库吗为什么没有数据传输方式

云服务器是一种虚拟服务器,它提供了一个存储和计算资源,可以让用户在其上运行各种软件和应用程序。但是,由于云服务器没有数据库,因此也不能直接进行数据传输。云服务器通常由许多服务器组成,其中包括一个数据库服务器,用于存储和管理云服务器上的数据。当用户需要访问或共享云服务器上的数据时,他们需要使用云服务器提供的远程数据传输功能,例如通过网络或通过云服务器与其他用户连接。数据传输方式可以有以下几种:远程镜像(RMO...
2023-10-27

云服务器包括数据库吗为什么没有数据传输协议

云服务器(CloudServer)不包括数据库,因为它们是为提供高性能、高可用性和快速响应而设计的。数据传输协议是为了保证云服务器上的应用程序之间的数据在传输时保持一致性和可访问性而定义的,这些协议通常使用HTTP或其他协议。此外,云服务器通常不提供数据加密和安全性服务,这使得对数据的访问变得更加困难和不安全。因此,如果您想要在云服务器上存储数据,您可能需要考虑使用SSL(安全套接层)加密或其他安全认证方式来保护数据...
2023-10-27

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录