粘包问题和struck解决
一:struct模块的使用
import struct
import json
header_dic={
'filename':'a.txt',
'total_size':11112313123212222222222222222222222222222222222222222222222222222221111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111131222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222223,
'hash':'asdf123123x123213x'
} #定义报头,字典格式,报头里面可以存储各种需要的信息
header_json=json.dumps(header_dic)
#将报头序列化,得到一个json字符串
header_bytes=header_json.encode('utf-8')
#得到json的二进制格式
obj=struct.pack('i',len(header_bytes))#将整形数字打包成字节格式
#打包成二进制字典长度,发送给客户端
print(obj,len(obj))
# res=struct.unpack('i',header)#解包,是元祖形式,第一个是字节串长度
# print(res[0])
二:解决粘包问题
1, 服务端
from socket import *
import subprocess
import struct
import json
server=socket(AF_INET,SOCK_STREAM)
server.bind(('127.0.0.1',8080))
server.listen(5)
while True:
conn,client_addr=server.accept()
print('新的客户端',client_addr)
while True:
try:
cmd=conn.recv(1024) #cmd=b'dir'
if len(cmd) == 0:break
# 运行系统命令
obj=subprocess.Popen(cmd.decode('utf-8'),
shell=True,
stderr=subprocess.PIPE,
stdout=subprocess.PIPE
)
stdout=obj.stdout.read()
stderr=obj.stderr.read()
#先制作报头
header_dic={
'filename':'a.txt',
'total_size':len(stdout) + len(stderr),
'hash':'xasf123213123'
}
header_json=json.dumps(header_dic)
header_bytes=header_json.encode('utf-8')
#1、先把报头的长度len(header_bytes)打包成4个bytes,然后发送
conn.send(struct.pack('i',len(header_bytes)))
#2、发送报头
conn.send(header_bytes)
#3、再发送真实的数据
conn.send(stdout)
conn.send(stderr)#用加号发送系哦啊率不高,最好发两次比较好
except ConnectionResetError:
break
conn.close()
2,客户端
from socket import *
import struct
import json
client=socket(AF_INET,SOCK_STREAM)
client.connect(('127.0.0.1',8080))
while True:
cmd=input('>>: ').strip()
if len(cmd) == 0:continue
client.send(cmd.encode('utf-8'))
#1、先收4个字节,该4个字节中包含报头的长度
header_len=struct.unpack('i',client.recv(4))[0]
#2、再接收报头
header_bytes=client.recv(header_len)
#从报头中解析出想要的内容
header_json=header_bytes.decode('utf-8')
header_dic=json.loads(header_json)
print(header_dic)
total_size=header_dic['total_size']
#3、再收真实的数据
recv_size=0
res=b''
while recv_size < total_size :
data=client.recv(1024)
res+=data
recv_size+=len(data)
print(res.decode('gbk'))
粘包问题和struck解决相关推荐
- TCP粘包问题分析和解决(全)
TCP通信粘包问题分析和解决(全) 在socket网络程序中,TCP和UDP分别是面向连接和非面向连接的.因此TCP的socket编程,收发两端(客户端和服务器端)都要有成对的socket,因此,发送 ...
- TCP通信粘包问题分析和解决
在socket网络程序中,TCP和UDP分别是面向连接和非面向连接的.因此TCP的socket编程,收发两端(客户端和服务器端)都要有成对的socket,因此,发送端为了将多个发往接收端的包,更有效的 ...
- 网络:TCP粘包问题?如何解决?
看面经时,看到有面试官问TCP的粘包问题.想起来研一做购物车处理数据更新时遇到粘包问题,就总结一下吧. 1 什么是粘包现象 TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看, ...
- Netty粘包拆包问题说明、演示拆包粘包情况代码以及解决
概述 TCP传输协议是面向连接的,面向流提供高可靠的服务.收发两端(服务端和客户端)都要有一一成对的socket,因此,发送端为了将多个发给接收端的包,更有效地发给对方,使用了优化算法(Nagle算法 ...
- Netty学习总结(5)——Netty之TCP粘包/拆包问题的解决之道
无论是服务端还是客户端,读取或者发送消息的时候,都需要考虑TCP底层的粘包/拆包机制. TCP粘包/拆包 TCP是个"流"协议. 流:没有界限的一串数据.如同河里的流水,它们是连成 ...
- 并发编程知识总结,软件开发架构,socket套接字模板,粘包问题,struct解决粘包问题,上传大文件数据,socketserver,关于操作系统的发展史,进程,线程。...
并发编程知识总结 软件开发架构 C/S: client:客户端 server:服务端 优点:占用网络资源少,软件的使用稳定 缺点:服务端更新后,客户端也要更新,需要使用多个软件,需要下载多个客户端 B ...
- TCP粘包,拆包及解决方法、丢包的原因及解决办法
参考此博客https://blog.insanecoder.top/tcp-packet-splice-and-split-issue/ 粘包.拆包发生原因 发生TCP粘包或拆包有很多原因,现列出常见 ...
- 丢包、拆包、粘包的原因及解决办法
参考此博客https://blog.insanecoder.top/tcp-packet-splice-and-split-issue/ 粘包.拆包发生原因 发生TCP粘包或拆包有很多原因,现列出常 ...
- 关于为什么出现粘包问题及如何解决!
1 什么是粘包现象 TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾. 2 为什么出现粘包现象 (1)发送方原因 我们知道,TCP默认会使 ...
- TCP 中粘包的产生和解决
当发送方的"发送速度"大于接收方的"处理速度"时,就会出现问题. 比如:接收方一直没有处理,发送方第一次发送一个包大小为 100 字节,第二次发送 200 字节 ...
最新文章
- php 词法分析,【PHP7源码学习】2019-03-20 PHP词法分析
- Andriod --- JetPack (四):BaseObservable 与 ObservableField 双向绑定
- SpringMVC(SSM)框架搭建JavaWeb项目时,前端页面文件上传,后台Java下载功能实现及相关问题记录说明
- 异常处理机制——panic 和 recover
- 结构数据类型 struce c# 1613533319
- 诺基亚n1系统更新显示无网络_曾经世界第一大手机系统,诺基亚塞班系统竟还活着!你用过吗?...
- 将SVG 转换为png -- ImageMagick 转换 svg 为透明png 图
- 富士施乐m115b怎么连接电脑_富士施乐m115b驱动下载
- 10247: 爱好数学的国王(唯一分解定理)
- 51单片机--蜂鸣器
- DFS.01-寻路问题
- Barcode Reader在45毫秒内实现条码识别
- 操作系统接口之批处理作业
- 方便实用的串口调试工具/串口调试助手/串口精灵 (工具一)
- 东芝存储器株式会社计划搬迁总部
- 细说http状态码之301,304
- python基础(第九章)面向对象
- 9.数据中台 --- 数据服务体系建设
- Discuz!教程之论坛编辑器默认勾选HTML代码的修改方法
- 三年级下册分数计算机题,三年级下册数学卷子题
热门文章
- Log Parser Lizard(日志分析工具)v6.7.1官方版
- tftp工作流程计算机网络,tftpd32使用方法,[转载]利用GhostSrv+Tftpd32网络克隆攻略
- ie上直接打开服务器word文档,win7 ie11直接打开word
- “Win10 无法使用内置管理员账户打开(应用程序)“怎么办
- 金仓数据库字段_金仓数据库认证工程师(KCE)考试试题_含答案_
- Linux常见英文报错中文翻译
- SpringMVC中session的使用
- 艾永亮:百果园的商业模式是什么?打造超级产品引领生鲜电商行业
- Python基础学习笔记-4.组合数据类型
- 读《把时间当作朋友:运用心智获得解放》