Python3之socket编程解决粘包问题
来源:互联网 发布:菠萝饭软件怎么样 编辑:程序博客网 时间:2024/06/05 09:50
什么是粘包
当发送网络数据时,tcp协议会根据Nagle算法将时间间隔短,数据量小的多个数据包打包成一个数据包,先发送到自己操作系统的缓存中,然后操作系统将数据包发送到目标程序所对应操作系统的缓存中,最后将目标程序从缓存中取出,而第一个数据包的长度,应用程序并不知道,所以会直接取出数据或者取出部分数据,留部分数据在缓存中,取出的数据可能第一个数据包和第二个数据包粘到一起。
粘包解决方案
由于应用程序自己发送的数据可以进行打包处理,自己制作协议,对数据进行封装添加报头,然后发送数据部分。而报头必须是固定长度,对方接受时可以先接受报头,对报头进行解析,然后根据报头内的封装的数据的长度对数据进行读取,这样收取的数据就是一个完整的数据包
具体代码实现
struct模块的使用
被struct打包的数据会变成bytes格式,这样便于数据的网络传输
服务端
import socketimport structimport subprocessphone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)phone.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)phone.bind(('127.0.0.1', 8080))phone.listen(5)while 1: conn, addr = phone.accept() while 1: try: data = conn.recv(1024) res = subprocess.Popen(data.decode('utf-8'), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout = res.stdout.read() stderr = res.stderr.read() # 发送报头 res = struct.pack('i', len(stdout) + len(stderr)) conn.send(res) # 发送数据部分 conn.send(stdout) conn.send(stderr) except Exception: break conn.close()phone.close()
客户端
import socketimport structphone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)phone.connect(('127.0.0.1', 8080))while 1: cmd = input('请输入>>:').strip() if not cmd: continue phone.send(cmd.encode('utf-8')) # 接受报头 res = phone.recv(4) # 对报头解压 data_size = struct.unpack('i', res)[0] # 根据报头数据长度对数据进行接收 recv_size = 0 total_data = b'' while recv_size < data_size: data_recv = phone.recv(1024) if (data_size - len(data_recv)) < 1024: left_data = phone.recv(data_size - len(data_recv)) total_data += left_data total_data += data_recv recv_size += len(data_recv) data = phone.recv(1024) print(data.decode('gbk'))phone.close()
基本所有的粘包问题可以基于此思路去解决,明天分享一个优化版的解决粘包方案
阅读全文
1 0
- Python3之socket编程解决粘包问题
- socket编程之解决流协议的粘包问题(一 )
- socket编程之解决流协议的粘包问题(二)
- Socket编程实践(5) --TCP粘包问题与解决
- Socket编程实践(5) --TCP粘包问题与解决
- Socket编程实践(5) --TCP粘包问题与解决
- iOS经典讲解之socket编程”粘包“问题
- Python3之socket网络编程
- erlang 解决socket 数据粘包问题
- socket网络编程粘包问题
- Python案例-网络编程-socket-解决ssh消息粘包问题
- JAVA Socket编程学习10--解决TCP粘包分包问题
- java socket解决半包、粘包问题
- Socket开发之通讯协议及处理(解决粘包问题)
- python3 socket抓包
- Socket编程 (异步通讯,解决Tcp粘包)
- Socket编程 (异步通讯,解决Tcp粘包)
- socket编程--粘包
- 关于python语句与列表,元组,字典等集合的题
- java项目搭建
- SimpleDateFormat显示格式如2017-05-20 15:00:10,怎么显示为24小时的格式,而不是2017-05-20 3:00:10
- XMemcachedClient实例的add方法和set方法区别
- UE4中删除多个子物体,只能删除一半
- Python3之socket编程解决粘包问题
- android7.0下TP做接近
- 广播监听网络
- 博客第一篇
- win10+vs13+cuda8.0+cudnnv5.1+caffe-windows+anaconda2.4
- LINGO软件入门
- 算法模板之并查集
- 总线设备驱动模型浅析
- 万能头文件#include<bits/stdc++.h>