1. 只有TCP有粘包现象,UDP永远不会粘包。
  2. 所谓粘包问题主要还是C/S两端数据传输时 因为接收方不知道消息之间的界限,不知道一次性提取多少字节的数据所造成的

  1. 根本原因:
    粘包是由TCP协议本身造成的,TCP为提高传输效率,发送方往往要收集到足够多的数据后才发送一个TCP段。若连续几次需要send的数据都很少,通常TCP会根据优化算法把这些数据合成一个TCP段后一次发送出去,这样接收方就收到了粘包数据。
  2.  
  3. 解决方法:
  4. 1、自定义字典类型 的数据报头{文件名:a,文件的size1090}计算出该报头的长度(len(字节)),
  5. 2、使用struct.pack('i',报头长度(一个数字))把一个数字压缩成固定的size 4个字节,发送给对端。
  6.  
  7. 3、对端 struct.unpack(‘i’,recv(4))接收固定大小4个字节;这就是接收到了 报头的长度。
  8.  
  9. 4.recv(报头长度)这就是发送过来的报头信息了
  1.  
  1.  
  1. import struct
  2. a='您好'
  3. a=len(a.encode('utf-8')) #字节的长度=====这个数据有多大字节
  4. # 1英文字母utf-8编码后=1字节
  5. # #1中文字符 utf-8编码后=3个字节a=struct.pack('i',a) #struct.pack把数字转换成 固定大小 4个字节的 字节
  6. print(len(a)) #4个字节
  7. print(struct.unpack('i',a)[0]) #struct.unpack[0] 解报头,索引第一个
  1. 服务端
  1. import socket
  2. import struct
  3. import json
  4. phon=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  5. phon.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
  6. phon.bind(("127.0.0.1",8090))
  7. phon.listen(80) #
  8. while True:
  9. conn,addr=phon.accept()
  10. while True:
  11. try:
  12. data=conn.recv(4) #接受4个字节的报头
  13. data=struct.unpack('i',data)[0]
  14. data1=conn.recv(data).decode('utf-8') #接受 字节类型的报头信息
  15. #{"file_name": "\u4f60\u597d", "file_size": 6}
  16. data1=json.loads(data1)
  17. print(data1)
  18. da=conn.recv(data1['file_size']).decode('utf-8') #接收真实数据
  19. print(da)
  20.  
  21. conn.send('sss'.encode('utf-8')) #发送接受的消息 给某一个客户端
  22. except Exception:
  23. break
  24. conn.close()
  25. phon.close()
  1. 客户端
  1. import socket
  2. import struct
  3. import json
  4. phon=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  5. phon.connect(('127.0.0.1',8090)) #客户端的phon.connect正好对于服务端的phon1.accept()
  6. while True: #循环通信
  7. mes=input('---->: '.strip())
  8. if not mes:
  9. continue
  10. mes = mes.encode('utf-8')
  11. mes_len = len(mes)
  12. head = {'file_name': mes.decode('utf-8'), 'file_size': mes_len}
  13. head_json = json.dumps(head) # {"file_name": "a", "file_size": 1}
  14. head_bytes = head_json.encode('utf-8')
  15. head_bytes_len = len(head_bytes) #
  16. struct1 = struct.pack('i',head_bytes_len)
  17. send_=phon.send(struct1) #发送4个字节的 报头长度
  18. data=phon.send(head_bytes) #发送报头
  19. da=phon.send(mes) #发送真实数据
  20.  
  21. 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传输&粘包传输的更多相关文章

  1. Python网络编程之TCP套接字简单用法示例

    Python网络编程之TCP套接字简单用法示例 本文实例讲述了Python网络编程之TCP套接字简单用法.分享给大家供大家参考,具体如下: 上学期学的计算机网络,因为之前还未学习python,而jav ...

  2. [Python] 网络编程之TCP编程

    转自:TCP编程 - 廖雪峰的官方网站 Socket是网络编程的一个抽象概念.通常我们用一个Socket表示“打开了一个网络链接”,而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协 ...

  3. python网络编程之TCP通信实例

    一. server.py import socket host="localhost" port= s=socket.socket(socket.AF_INET,socket.SO ...

  4. java网络编程之TCP通讯

    java中的网络编程之TCP协议的详细介绍,以及如何使用,同时我在下面举2例说明如何搭配IO流进行操作, /* *TCP *建立连接,形成传输数据的通道: *在连接中进行大数据量传输: *通过三次握手 ...

  5. Java网络编程之TCP、UDP

    Java网络编程之TCP.UDP 2014-11-25 15:23 513人阅读 评论(0) 收藏 举报 分类: java基础及多线程(28) 版权声明:本文为博主原创文章,未经博主允许不得转载.   ...

  6. 网络编程之TCP/IP各层详解

    网络编程之TCP/IP各层详解 我们将应用层,表示层,会话层并作应用层,从TCP/IP五层协议的角度来阐述每层的由来与功能,搞清楚了每层的主要协议,就理解了整个物联网通信的原理. 首先,用户感知到的只 ...

  7. 网络编程之TCP编程

    网络编程之TCP编程 前面已经介绍过关于TCP协议的东西,这里不做赘述.Java对于基于TCP协议的网络通信提供了良好的封装,Java使用socket对象来代表两端的通信窗口,并通过Socket产生I ...

  8. Java网络编程之TCP

    Java网络编程之TCP ​ TCP主要需要两个类:Socket和ServerSocket,Socket是客户端连接服务器时创建,参数需要指定服务器的ip和端口,ServerSocket是服务器端创建 ...

  9. python 网络编程之socket开发和socketserver模块

    一 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网中处处是C/S架构 如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种) 腾讯作为服务端为你提供视频 ...

随机推荐

  1. iOS 设置View阴影

    iOS 设置View投影 需要设置 颜色 阴影半径 等元素 UIView *shadowView = [[UIView alloc] init]; shadowView.frame = CGRectM ...

  2. Ubuntu composer 安装thinkphp5 失败,报错:[ErrorException] mkdir(): Permission denied

    在Linux环境下,使用composer安装thinkphp5,安装时,报错:[ErrorException]               mkdir(): Permission denied : 看 ...

  3. MongoDB的常用命令和增查改删

    数据库操作 Mongodb MySQL 查询库 show databases | show dbs show databases 选中库 use databaseName use databaseNa ...

  4. jest 自动化测试

    概述 jest 是 facebook 开源的,用来进行单元测试的框架,可以测试 javascipt 和 react. 单元测试各种好处已经被说烂了,这里就不多扯了.重点要说的是,使用 jest, 可以 ...

  5. 【English Teradata】名称缩写

    日常缩写 [GTM]Teradata Go-to-Market employees [GTS]Teradata Global Technical Support [GSC] [CS&S]Cus ...

  6. MySQL常用日期时间函数

    日期和时间函数: MySQL服务器中的三种时区设置: ①系统时区---保存在系统变量system_time_zone ②服务器时区---保存在全局系统变量global.time_zone ③每个客户端 ...

  7. day19-网络编程基础(二)

    今天没有很多概念性的东西,主要是方法性的东西以及编程的一些方法吧 今日份目录 1.UDP传输的特点以及实验 2.UTP与UDP传输的区别 3.基于tcp的low版带验证功能的FTP小程序 4.基于so ...

  8. vue.js sha256加密

    sha256: 1.使用cnpm安装 :cnpm install js-sha256 2.然后在组件中methods定义方法,在调用 let sha256 = require("js-sha ...

  9. 工具篇-Spring boot JPA多数据源

    写这篇博文是因为这个东西坑太多,首先说明下边实现的多数据源不是动态切换的,应该算是静态的. 坑一.pom文件 pom中spring boot以及mysql connector的版本一定要注意. < ...

  10. 基于 WebGL 的 HTML5 楼宇自控 3D 可视化监控

    前言 智慧楼宇和人们的生活息息相关,楼宇智能化程度的提高,会极大程度的改善人们的生活品质,在当前工业互联网大背景下受到很大关注.目前智慧楼宇可视化监控的主要优点包括: 智慧化 -- 智慧楼宇是一个生态 ...