Python网络编程,粘包、分包问题的解决
tcp编程中的粘包、分包问题的解决:
参考:https://blog.csdn.net/yannanxiu/article/details/52096465
服务端:
#!/bin/env python
# -*- coding:utf-8 -*-
import socket
import time
import struct
import json
import socket
import sys
class SockPackBody():
def __init__(self , data_buffer = bytes() , header_size = 4):
self.data_buffer = data_buffer
self.header_size = header_size
self.header = None
self.body_size = 0
self.body = None
def PackBody(self , sock):
while True:
'''一次接收循环'''
recv_pkg = sock.recv(1024)
if not recv_pkg and len(self.data_buffer) == 0 :
'''connect closed , and no data in buffer.'''
return None
self.data_buffer += recv_pkg
if len(self.data_buffer) < self.header_size:
'''接收到的数据包小于self.headerSize,说明连包头都没接受完整'''
continue
self.header = struct.unpack("!1I" , self.data_buffer[:self.header_size])
self.body_size = self.header[0]
#分包
if len(self.data_buffer) < self.header_size + self.body_size:
'''接收到的数据包小于self.header_size + self.body_size,说明整个数据包都没接受完整'''
continue
self.body = self.data_buffer[self.header_size:self.header_size + self.body_size]
#粘包
self.data_buffer = self.data_buffer[self.header_size + self.body_size:]
return self.body
if __name__ == '__main__':
sock_pkger = SockPackBody()
sock = socket.socket(socket.AF_INET , socket.SOCK_STREAM)
sock.bind(('0.0.0.0' , 6688))
sock.listen(5)
agent_sock , agent_addr = sock.accept()
n = 1
while True:
'''一次连接(会话)循环'''
recv_data = sock_pkger.PackBody(agent_sock)
if not recv_data:
agent_sock.close()
break
print recv_data
客户端:
import socket
import time
import struct
import json
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
serve_host = "localhost"
server_port = 6688
class PkgBuildHeader(object):
def __init__(self, body_size ,):
self.pack_header = struct.pack("!1I", body_size)
if __name__ == '__main__':
client = socket.socket()
client.connect(serve_host , server_port)
# 正常数据包定义
body = '''Link encap:Ethernet HWaddr 00:0C:29:EF:84:A3
inet addr:192.168.31.140 Bcast:192.168.31.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:feef:84a3/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:236844 errors:0 dropped:0 overruns:0 frame:0
TX packets:233949 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:107658740 (102.6 MiB) TX bytes:41874253 (39.9 MiB)
'''
header = PkgBuildHeader(len(body))
sendData1 = header.pack_header + body.encode()
# 分包数据定义
header = PkgBuildHeader(len(body))
sendData2_1 = header.pack_header+body[:20].encode()
sendData2_2 = body[20:].encode()
# 粘包数据定义
body1 = "Link encap:Ethernet HWaddr 00:0C:29:EF:84:A3"
header1 = PkgBuildHeader(len(body1))
body2 = "RX bytes:107658740 (102.6 MiB) TX bytes:41874253 (39.9 MiB)"
header2 = PkgBuildHeader(len(body2))
sendData3 = header1.pack_header+body1.encode()+header2.pack_header+body2.encode()
# 正常数据包
client.send(sendData1)
time.sleep(30)
# 分包测试
client.send(sendData2_1)
time.sleep(1)
client.send(sendData2_2)
time.sleep(3)
# 粘包测试
client.send(sendData3)
time.sleep(3)
client.close()
Python网络编程,粘包、分包问题的解决的更多相关文章
- python网络编程--粘包解决方案 和 subprocess模块
1.缓冲区:作用:将程序和网络解耦分为输入缓冲区, 输出缓冲区 每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区.write()/send() 并不立即向网络中传输数据,而是先 ...
- python 网络编程粘包解决方案2 + ftp上传 + socketserver
一.struct 神奇的打包工具 struct 代码: import struct num = 156 #将int类型的数据打包成4个字节的数据 num_stru = struct.pack('i', ...
- python 网络编程 粘包问题
1.粘包现象 TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾. 粘包出现原因 使用了优化方法(Nagle算法),将多次间隔较小.数据 ...
- python 网络编程---粘包
一.什么是粘包?(只有在TCP中有粘包现象,在UDP中永远不会粘包) 黏包不一定会发生. 如果发生 了:1.可能是在客户端已经粘了 2.客户端没有粘,可能是在服务端粘了. 所谓的粘包问题:主要是是因为 ...
- 网络编程----粘包以及粘包问题的解决、FTP上传
一.粘包现象 让我们基于tcp先制作一个远程执行命令的程序(1:执行错误命令 2:执行ls 3:执行ifconfig) 注意注意: res=subprocess.Popen(cmd.decode('u ...
- Python网络编程04 /recv工作原理、展示收发问题、粘包现象
Python网络编程04 /recv工作原理.展示收发问题.粘包现象 目录 Python网络编程04 /recv工作原理.展示收发问题.粘包现象 1. recv工作原理 2. 展示收发问题示例 发多次 ...
- python网络编程:TCP通讯模板、粘包及解决方案、自定义报头
一.TCP通讯模板 二.远程CMD程序 三.解决粘包问题 四.解决粘包问题2 一.TCP通讯模板 TCP客户端 import socket c = socket.socket() # 连接服务器 c. ...
- Python网络编程(2)-粘包现象及socketserver模块实现TCP并发
1. 基于Tcp的远程调用命令实现 很多人应该都使用过Xshell工具,这是一个远程连接工具,通过上面的知识,就可以模拟出Xshell远程连接服务器并调用命令的功能. Tcp服务端代码如下: impo ...
- Python学习笔记【第十四篇】:Python网络编程二黏包问题、socketserver、验证合法性
TCP/IP网络通讯粘包问题 案例:模拟执行shell命令,服务器返回相应的类容.发送指令的客户端容错率暂无考虑,按照正确的指令发送即可. 服务端代码 # -*- coding: utf- -*- # ...
- Python 网络编程(二)
Python 网络编程 上一篇博客介绍了socket的基本概念以及实现了简单的TCP和UDP的客户端.服务器程序,本篇博客主要对socket编程进行更深入的讲解 一.简化版ssh实现 这是一个极其简单 ...
随机推荐
- BiLSTM学习
转自:https://blog.csdn.net/aliceyangxi1987/article/details/77094970 https://blog.csdn.net/jojozhangju/ ...
- mybatis oracle 插入自增记录 获取主键值 写回map参数
网上搜了好多文章照着弄都返回不了主键给map, 实践证明要在传入的map参数里写回插入的主键,要这样写 <selectKey resultType="java.lang.Integer ...
- xcode 报错Failed to load project at xxxx ,incompatible project version
错误原因: 由于工程是低版本的Xcode建立的,在使用高版本的Xcode打开时会出现编译不了工程. 解决方法: 鼠标右击.xcodeproj文件 —>显示包内容 —>打开project.p ...
- 动手动脑(&课后实验):类和对象
1. 以下代码为何无法通过编译?哪儿出错了? 如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法.而此时程序中已提供了一个有一个参数的构造函数,而定义对象时却没有参数,所以程序会报错. ...
- 记无法用被动方式登录远程linux主机的原因
[环境]: linux主机:华为企业云 ftp服务端:vsftpd 客户端:ftp命令行工具,安卓端ES文件浏览器 [现象]: 在ES文件浏览器中,使用被动方式没法连接,使用主动方式可以连接,但是没法 ...
- tensorflow tensor 索引
问题: self.q_eval4next: (100,2) ix=[0,1,0,1---0,1](100,1) 我想取q_eval4next[:,idx] #use_doubleQ 切片用!!!! s ...
- Rpgmakermv(7) Chronus插件介绍翻译
协议:MIT 作用:时间,有时间推进,可以设置速度,随着游戏中时间的推进,会发生昼夜改变和天气变化. ------------------------------------------------- ...
- Codeforces Round #324 (Div. 2) E
这题贪心,考虑先放第一个,然后从第一个数在p中的位置, 不断的往前走,和在他后面的那些数组进行交换,因为这样交换可以提高最大的效率,就是说你花费了1但是使得两个点都朝他的木匾节点减少了1 #inclu ...
- Python -- Pandas介绍及简单实用【转】
转http://www.datadependence.com/2016/05/scientific-python-pandas/ 一. Pandas简介 1.Python Data Analysis ...
- copy on write,代理模式
StringBuilder 内部用了代理的技术实现, 是可变字符串的代理 .net设计模式实例之代理模式(Proxy Pattern) 一.代理模式简介(Brief Introduction) 代理模 ...