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架构的一种) 腾讯作为服务端为你提供视频 ...
随机推荐
- TinScrapy-简化的Scrapy原码-查看爬虫的执行流程
学习了自定义的TinyScrapy框架,整理出以下定注释的代码 from twisted.web.client import getPage,defer from twisted.internet i ...
- iOS开发之Swift 4 JSON 解析指南
Apple 终于在 Swift 4 的 Foundation 的模块中添加了对 JSON 解析的原生支持. 虽然已经有很多第三方类库实现了 JSON 解析,但是能够看到这样一个功能强大.易于使用的官方 ...
- swoole多端口监听
今天测试swoole写webserver实现多端口监听.记录下爬过的坑:关于tcp协议监听触发不到receive!!!!! 首先上服务端代码 class Http { /** * 服务实例 * @va ...
- 【Teradata】扩容操作步骤
第一章,前期准备(旧系统信息收集) 1.DBScontrol关键信息 DBSCONTROL系统参数是在节点上设置的,其参数直接关系到系统全局,需要慎重设置,新节点的关键参数要与生产库一致或者相容.主要 ...
- vue2.0 :style :class样式设置
HTML :style 的用法 <el-dialog custom-class="creatUser-wrap" :style="{display:formShow ...
- js前端导出Excel表格后数字自动变成科学计数法问题
一般的文件导出都是后端进行导出,最近一个项目遇到导出接口挂掉了,前端实现导出的情况. 背景是vue框架,iView组件.可以直接使用exportCsv方法进行导出. 导出时进行一下行和列的切割就可以了 ...
- 替换空格[by Python]
题目: 请实现一个函数,将一个字符串中的空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 1.使用python自带的repla ...
- python基础语法、数据结构、字符编码、文件处理 练习题
考试范围 '''1.python入门:编程语言相关概念2.python基础语法:变量.运算符.流程控制3.数据结构:数字.字符串.列表.元组.字典.集合4.字符编码5.文件处理''' 考试内容 1.简 ...
- Mac进行 usr/bin 目录下修改权限问题,operation not permitted
一般情况下我们在使用mac系统过程中下载一些文件.新建一些项目之后,这些文件都会默认是只读状态,这时我们只需要简单的一句权限设置命令就可以解决 你要修改文件上层目录的路径 但是我们在对 usr/bin ...
- .Net Core HttpClient 忽略https证书提醒
在测试中经常会遇到请求一些https的url,但又没有本地证书,这时候可以用下面的方法忽略警告 var httpclientHandler = new HttpClientHandler(); htt ...