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实现 这是一个极其简单 ...
随机推荐
- Day7 初识面向对象,面向对象之继承、多态和封装
一.面向对象引言 一.面向对象的程序设计的由来 详述见:http://www.cnblogs.com/linhaifeng/articles/6428835.html 二.面向对象引子 写一个简单程序 ...
- @Value("#{}") 和 @Value("{}")
1 @Value("#{}") SpEL表达式 @Value("#{}") 表示SpEl表达式通常用来获取bean的属性,或者调用bean的某个方法.当然还 ...
- 家庭记账本之GitHub账号注册与安装(一)
账号注册 1.github是世纪上最大的开源代码托管网站.因为是国外网站,很多人在注册的时候因为不熟悉英语而犯了难. 2.百度搜索github进入官网.如果你已经有账号密码,那么点击右上角的sign ...
- Go linux 实践4
这是目前学习的最难的Go demo例子 ***************************************** 如果能看懂,你就出师了,我的任务也就结束了 **************** ...
- Sql Server 生成连续时间段
方法一: declare @StartTime datetime declare @EndTime datetime set @StartTime ='2019-02-1 00:00' set @En ...
- MS16-032 漏洞复现
exploit-db的详情: https://www.exploit-db.com/exploits/39574/ Windows: Secondary Logon Standard Handles ...
- 解决React Native使用Fetch API请求网络报Network request failed
问题来源: 1 . 在测试fetch数据请求时,Xcode9.0以上的无法请求https, 需要在Xcode中加载项目后修改Info.plist的相关配置,具体如下参考 问题及解决方法一模一样,不再重 ...
- R 包
[下面列出每个步骤最有用的一些R包] .数据导入 以下R包主要用于数据导入和保存数据: feather:一种快速,轻量级的文件格式:在R和python上都可使用 readr:实现表格数据的快速导入 r ...
- DOS命令下映射虚拟磁盘(驱动器)
---恢复内容开始--- subst命令,用于路径替换,进入dos窗口,键入“subst /?”(t和/之间有空格),会看到关于subst的用法如下: C:\Users\Administrator&g ...
- Unity shader学习之折射
shader如下: Shader "Custom/Refraction" { Properties { _Cubemap("Cubemap", Cube) = ...