PYTHON-TCP 粘包
1.TCP的模板代码
收发消息的循环 通讯循环
不断的连接客户端循环 连接循环
判断 用于判断客户端异常退出(抛异常)或close(死循环) 半连接池backlog listen(5)
占用的是内存空间 listen监听请求限制的是请求数 不是链接数
什么情况下会进入半连接池:来不及处理accept 或者客户端单方面终止连接
半连接池的工作原理
目前我们的程序是单线程 服务器要么处理通讯要么处理连接请求 无法同时进行
1 必须绑定规定的ip和port
2 必须对外稳定提供服务
3 必须能支持并发 服务端需要遵循的原则:
1. 服务端与客户端都需要有唯一的地址,但是服务端的地址必须固定/绑定
2. 对外一直提供服务,稳定运行
3. 服务端应该支持并发 2.远程CMD
粘包问题
一方发送空数据 导致程序卡死 今后会通过多线程处理 3.粘包问题 TCP:流式协议
引起粘包的TCP特点:
1 数据流没有开头也没有结果,像水流一样
2 TCP协议有一个nagle算法, 解决粘包的方案 自定义报头 1.先用报头传输数据的长度
对于我们远程CMD程序来说 只要先传输长度就能解决粘包的问题
但是如果做得是一个文件上传下载 除了数据的长度 还需要传输文件的名字 md5等等信息
又该如何?
解决方法:
发送方
1.先告诉对方你要发的数据的长度
2.在发送真实数据
接收方
1.先接收数据的长度信息
2.根据长度信息循环获取直到以获取的长度等于总长度 2.自定义复杂报头 完成发送一些额外的信息 例如文件名
1.将要发送的额外数据打包成一个字典作为报头
3.先发送报头的bytes长度(转json字符串 转bytes字节)
4.再发送报头数据
5.最后发送真实数据 #服务端: #客户端:
# 执行命令
# 显示错误信息和正确信息
# 制作一个报头信息 (转json字符串 转bytes字节)
# 发送报头长度 # 先接收报头的长度(int)
# 发送报头 # 接收报头(字节)
# 发送真实数据 # 解析报头 转为json字符串str,再转为字典dic
# 根据报头内的信息,收取真实的数据 涉及模块:
struct
整型转字节,转成的bytes是固定长度的
i 表示int 长度为4字节 q表示long int 长度为8字节
print(len(struct.pack("i",10240)))
字节转整型 得到一个元祖!!!
print(struct.unpack("q",struct.pack("q",10240))[0])
struct.pack('i',整形变量)
struct.unpack('i',字节变量) 服务器端示例:
# 为了方便存取 可以把需要的信息打包为一个字典
dic{
"filename":"仓老师视频教学 如何做炸鸡!",
"md5":"xzxbzxkbsa1212121",
"total_size":2121221
}
# 字典转字符串? json
head_dic = str(dict)
bytes = head_dic.encode("utf-8")
# 先发送这个字典字符串的长度
dic_len = len(head_dic)
#将长度转为了 字节
bytes_len = struct.pack("i",dic_len)
# 发送报头的长度
c.send(bytes_len) # 发送真实数据
c.send(xxx.mp4.bytes)
TCP能传的只有字节 # 服务端
#执行结果长
p_len=len(stdout)+len(stderr)
# 将报头信息dic转json字符串,编码为字节,字节的长度,用struct固定,发送报头长度
# 发送报头(编码为字节)
# 再发送真实数据stdout ,stderr # 客户端 # 先接收报头长度 用struct unpack拿到元祖取[0]
# 接收报头
# 解析报头,解码,json反序列化拿到字典,通过字典获取字典中的总长度
# 根据报头信息,收取真实的数据 按1024接受,判断当总长度>0时不断累加总数据和收到的数据长度
PYTHON-TCP 粘包的更多相关文章
- python tcp 粘包问题解决、文件下载等
from socket import * #以下是关于tcp:服务端 和 客户端的小例子#服务端socket_server = socket(AF_INET, SOCK_STREAM) socket_ ...
- python套接字解决tcp粘包问题
python套接字解决tcp粘包问题 目录 什么是粘包 演示粘包现象 解决粘包 实际应用 什么是粘包 首先只有tcp有粘包现象,udp没有粘包 socket收发消息的原理 发送端可以是一K一K地发送数 ...
- Python全栈-网络编程-TCP粘包
一.什么是TCP粘包 C/S架构下,接收方不知道每个消息的发送间隙.也不知道每次应该提取多少个字节的数据,与此同时,TCP是面向连接的,面向流的,收发两端都要有,因此发送端为了将多个发往接收端的数据包 ...
- c#解决TCP“粘包”问题
一:TCP粘包产生的原理 1,TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾.出现粘包现象的原因是多方面的,它既可能由发送方造成,也可能 ...
- Python之粘包
Python之粘包 让我们基于tcp先制作一个远程执行命令的程序(1:执行错误命令 2:执行ls 3:执行ifconfig) 注意注意注意: res=subprocess.Popen(cmd.deco ...
- tcp粘包、解决粘包问题
目录 subproess模块 TCP粘包问题 粘包两种情况 解决粘包问题 struct模块的使用 使用struct模块解决粘包 优化解决粘包问题 上传大文件 服务端 客户端 UDP协议 upd套接字 ...
- Python进阶----粘包,解决粘包(旗舰版)
Python进阶----粘包,解决粘包(旗舰版) 一丶粘包 只有TCP有粘包现象,UDP永远不会粘包 什么是粘包 存在于客户端接收数据时,不能一次性收取全部缓冲区中的数据.当下一次再有数据来时 ...
- tcp粘包问题原因及解决办法
1.粘包概念及产生原因 1.1粘包概念: TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾. 粘包可能由发送方造成,也可能由接收方造成. ...
- Socket编程(4)TCP粘包问题及解决方案
① TCP是个流协议,它存在粘包问题 TCP是一个基于字节流的传输服务,"流"意味着TCP所传输的数据是没有边界的.这不同于UDP提供基于消息的传输服务,其传输的数据是有边界的.T ...
- Netty(三)TCP粘包拆包处理
tcp是一个“流”的协议,一个完整的包可能会被TCP拆分成多个包进行发送,也可能把小的封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题. 粘包.拆包问题说明 假设客户端分别发送数据包D1和D ...
随机推荐
- 解决Win8.1 IE11兼容性问题的方法
装了64位win8.1企业版,IE11出现了一些兼容性问题,如个别网银网页兼容问题,还有office.迅雷.adobe reader.旋风等等插件不兼容不能加载的问题. 折腾了一天总算全部解决了,主要 ...
- 【bzoj5161】最长上升子序列 状压dp+打表
题目描述 现在有一个长度为n的随机排列,求它的最长上升子序列长度的期望. 为了避免精度误差,你只需要输出答案模998244353的余数. 输入 输入只包含一个正整数n.N<=28 输出 输出只包 ...
- P1169 [ZJOI2007]棋盘制作 && 悬线法
P1169 [ZJOI2007]棋盘制作 给出一个 \(N * M\) 的 \(01\) 矩阵, 求最大的正方形和最大的矩形交错子矩阵 \(n , m \leq 2000\) 悬线法 悬线法可以求出给 ...
- Hadoop基础-HDFS的API常见操作
Hadoop基础-HDFS的API常见操作 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本文主要是记录一写我在学习HDFS时的一些琐碎的学习笔记, 方便自己以后查看.在调用API ...
- nGrinder TestRunnerInsertMysqlMore.groovy
s C:\Users\Lindows\workspace\GroovyTest\src\com\iteye\lindows\mysql\TestRunnerInsertMysqlMore.groovy ...
- Java语法总结--Java集合类
这一节我们来总结一下Java集合类. Java集合总结 继承与Collection接口的–List接口 List接口本身的特点 常见的继承List接口的实用类 实用类对比 继承与Collection接 ...
- jQuery实现滚动监听
1.设计思路 1)获取窗口滚动高度: 2)获取附加导航栏: 3)获取导航栏下的所有li: 4)通过相同class获取所有监听元素:(此例中为jumbotron巨幕) 5)遍历所有监听元素,若当前元素距 ...
- HTTP1.0、HTTP1.1和HTTP2.0的区别
一.HTTP的历史 早在HTTP建立之初,主要就是为了将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器.也是说对于前端来说,我们所写的HTML页面将要放在我们的web服务器上,用户端 ...
- STM32建立基本项目
1.下载固件库解压 2.Keil建立项目,项目下建立三个文件夹3.各目录下从固件库中拷贝对应的目录 4.修改main.c文件 5.修改C++ 6.修改Include 7,编译.
- Scapy Fuzz实现——S7协议从建连到“正常交流“(一)
转载:安全客 酝酿了“三秒钟“,准备理清逻辑写写我学习的心得,自认为和Siemens S7协议有过一段时间浅浅的“交流”,所以这过程中涉及到了自己整理的自认为有用的东西,涉及工具.脚本这般,发出来让大 ...