python 网络编程之TCP传输&粘包传输
- 只有TCP有粘包现象,UDP永远不会粘包。
- 所谓粘包问题主要还是C/S两端数据传输时 因为接收方不知道消息之间的界限,不知道一次性提取多少字节的数据所造成的
- 根本原因:
粘包是由TCP协议本身造成的,TCP为提高传输效率,发送方往往要收集到足够多的数据后才发送一个TCP段。若连续几次需要send的数据都很少,通常TCP会根据优化算法把这些数据合成一个TCP段后一次发送出去,这样接收方就收到了粘包数据。- 解决方法:
- 1、自定义字典类型 的数据报头{文件名:a,文件的size:1090}计算出该报头的长度(len(字节)),
- 2、使用struct.pack('i',报头长度(一个数字))把一个数字压缩成固定的size 4个字节,发送给对端。
- 3、对端 struct.unpack(‘i’,recv(4))接收固定大小4个字节;这就是接收到了 报头的长度。
- 4.recv(报头长度)这就是发送过来的报头信息了
- import struct
- a='您好'
- a=len(a.encode('utf-8')) #字节的长度=====这个数据有多大字节
- # 1英文字母utf-8编码后=1字节
- # #1中文字符 utf-8编码后=3个字节a=struct.pack('i',a) #struct.pack把数字转换成 固定大小 4个字节的 字节
- print(len(a)) #4个字节
- print(struct.unpack('i',a)[0]) #struct.unpack[0] 解报头,索引第一个
- 服务端
- import socket
- import struct
- import json
- phon=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
- phon.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
- phon.bind(("127.0.0.1",8090))
- phon.listen(80) #
- while True:
- conn,addr=phon.accept()
- while True:
- try:
- data=conn.recv(4) #接受4个字节的报头
- data=struct.unpack('i',data)[0]
- data1=conn.recv(data).decode('utf-8') #接受 字节类型的报头信息
- #{"file_name": "\u4f60\u597d", "file_size": 6}
- data1=json.loads(data1)
- print(data1)
- da=conn.recv(data1['file_size']).decode('utf-8') #接收真实数据
- print(da)
- conn.send('sss'.encode('utf-8')) #发送接受的消息 给某一个客户端
- except Exception:
- break
- conn.close()
- phon.close()
- 客户端
- import socket
- import struct
- import json
- phon=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
- phon.connect(('127.0.0.1',8090)) #客户端的phon.connect正好对于服务端的phon1.accept()
- while True: #循环通信
- mes=input('---->: '.strip())
- if not mes:
- continue
- mes = mes.encode('utf-8')
- mes_len = len(mes)
- head = {'file_name': mes.decode('utf-8'), 'file_size': mes_len}
- head_json = json.dumps(head) # {"file_name": "a", "file_size": 1}
- head_bytes = head_json.encode('utf-8')
- head_bytes_len = len(head_bytes) #
- struct1 = struct.pack('i',head_bytes_len)
- send_=phon.send(struct1) #发送4个字节的 报头长度
- data=phon.send(head_bytes) #发送报头
- da=phon.send(mes) #发送真实数据
- phon.close()
参考&相关资料:
https://www.cnblogs.com/sss4/p/6807515.html --简单
https://www.cnblogs.com/guobaoyuan/p/6809447.html --更详细
https://gist.github.com/kevinkindom/108ffd675cb9253f8f71
python 网络编程之TCP传输&粘包传输的更多相关文章
- Python网络编程之TCP套接字简单用法示例
Python网络编程之TCP套接字简单用法示例 本文实例讲述了Python网络编程之TCP套接字简单用法.分享给大家供大家参考,具体如下: 上学期学的计算机网络,因为之前还未学习python,而jav ...
- [Python] 网络编程之TCP编程
转自:TCP编程 - 廖雪峰的官方网站 Socket是网络编程的一个抽象概念.通常我们用一个Socket表示“打开了一个网络链接”,而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协 ...
- python网络编程之TCP通信实例
一. server.py import socket host="localhost" port= s=socket.socket(socket.AF_INET,socket.SO ...
- java网络编程之TCP通讯
java中的网络编程之TCP协议的详细介绍,以及如何使用,同时我在下面举2例说明如何搭配IO流进行操作, /* *TCP *建立连接,形成传输数据的通道: *在连接中进行大数据量传输: *通过三次握手 ...
- Java网络编程之TCP、UDP
Java网络编程之TCP.UDP 2014-11-25 15:23 513人阅读 评论(0) 收藏 举报 分类: java基础及多线程(28) 版权声明:本文为博主原创文章,未经博主允许不得转载. ...
- 网络编程之TCP/IP各层详解
网络编程之TCP/IP各层详解 我们将应用层,表示层,会话层并作应用层,从TCP/IP五层协议的角度来阐述每层的由来与功能,搞清楚了每层的主要协议,就理解了整个物联网通信的原理. 首先,用户感知到的只 ...
- 网络编程之TCP编程
网络编程之TCP编程 前面已经介绍过关于TCP协议的东西,这里不做赘述.Java对于基于TCP协议的网络通信提供了良好的封装,Java使用socket对象来代表两端的通信窗口,并通过Socket产生I ...
- Java网络编程之TCP
Java网络编程之TCP TCP主要需要两个类:Socket和ServerSocket,Socket是客户端连接服务器时创建,参数需要指定服务器的ip和端口,ServerSocket是服务器端创建 ...
- python 网络编程之socket开发和socketserver模块
一 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网中处处是C/S架构 如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种) 腾讯作为服务端为你提供视频 ...
随机推荐
- iOS 设置View阴影
iOS 设置View投影 需要设置 颜色 阴影半径 等元素 UIView *shadowView = [[UIView alloc] init]; shadowView.frame = CGRectM ...
- Ubuntu composer 安装thinkphp5 失败,报错:[ErrorException] mkdir(): Permission denied
在Linux环境下,使用composer安装thinkphp5,安装时,报错:[ErrorException] mkdir(): Permission denied : 看 ...
- MongoDB的常用命令和增查改删
数据库操作 Mongodb MySQL 查询库 show databases | show dbs show databases 选中库 use databaseName use databaseNa ...
- jest 自动化测试
概述 jest 是 facebook 开源的,用来进行单元测试的框架,可以测试 javascipt 和 react. 单元测试各种好处已经被说烂了,这里就不多扯了.重点要说的是,使用 jest, 可以 ...
- 【English Teradata】名称缩写
日常缩写 [GTM]Teradata Go-to-Market employees [GTS]Teradata Global Technical Support [GSC] [CS&S]Cus ...
- MySQL常用日期时间函数
日期和时间函数: MySQL服务器中的三种时区设置: ①系统时区---保存在系统变量system_time_zone ②服务器时区---保存在全局系统变量global.time_zone ③每个客户端 ...
- day19-网络编程基础(二)
今天没有很多概念性的东西,主要是方法性的东西以及编程的一些方法吧 今日份目录 1.UDP传输的特点以及实验 2.UTP与UDP传输的区别 3.基于tcp的low版带验证功能的FTP小程序 4.基于so ...
- vue.js sha256加密
sha256: 1.使用cnpm安装 :cnpm install js-sha256 2.然后在组件中methods定义方法,在调用 let sha256 = require("js-sha ...
- 工具篇-Spring boot JPA多数据源
写这篇博文是因为这个东西坑太多,首先说明下边实现的多数据源不是动态切换的,应该算是静态的. 坑一.pom文件 pom中spring boot以及mysql connector的版本一定要注意. < ...
- 基于 WebGL 的 HTML5 楼宇自控 3D 可视化监控
前言 智慧楼宇和人们的生活息息相关,楼宇智能化程度的提高,会极大程度的改善人们的生活品质,在当前工业互联网大背景下受到很大关注.目前智慧楼宇可视化监控的主要优点包括: 智慧化 -- 智慧楼宇是一个生态 ...