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实现 这是一个极其简单 ...
随机推荐
- git 不区分文件大小写的处理
- 利用TensorFlow实现多元线性回归
利用TensorFlow实现多元线性回归,代码如下: # -*- coding:utf-8 -*- import tensorflow as tf import numpy as np from sk ...
- 函数 return
return 的作用 一.返回一个值给函数,主函数调用这个函数后能得到这个返回的值.二.结束函数,例如你运行到一个地方,虽然后面还有代码但是你不想再继续运行,这时就可以直接用 return:这条语句来 ...
- (已解决)在linux的虚拟机上安装vmware tools(实现windows与虚拟机之间的文件交互复制粘贴)
Linux下需要安装VMware Tools工具来实现主机和虚拟机直接文件复制粘贴功能,安装方法如下: ①点击虚拟机VM菜单栏--虚拟机--安装VMware Tools. ②然后RedHat系统中弹出 ...
- Hibernate框架第二天
### Hibernate的持久化类 ### ---------- **什么是持久化类** 1. 持久化类:就是一个Java类(咱们编写的JavaBean),这个Java类与表建立了映射关系就可以成为 ...
- System.BadImageFormatException”C#报错
在平常的开发中或多或少会遇到一些问题,而本次向小编这里是自己刚刚解决的一个问题,贴出来与大家分享一下,纠结了一个下午,终于解决了,是有关平台的一个报错问题. 方法/步骤 报错”“Syste ...
- C# 如何批量修改集合元素的属性值?
我们往往会遇到要批量修改集合中元素的值,最笨的办法就是foreach循环,但本文介绍几种优雅的方法. 首先,我们准备好元素类和初始集合: 下面就是几种方法,目前并没有对性能做进一步的测试,有兴趣的童鞋 ...
- <5>Cocos Creator 脚本简介
1.创建脚本 在资源管理器窗口中点击鼠标右键,显示菜单中点击新建,选择新建的脚本类型,这里举例就选择菜单中的JavaScript,或者如下图点击创建按钮也可. 新建后就会在资源管理器中出现一个NewS ...
- windows启动项管理
在运行框中输入 msconfig 选择启动栏 会跳转到任务管理器,可以管理启动项,可以看到我的启动项里有nc病毒 ,点击禁用即可.
- Aggregated Counting(找规律 + 预处理)
Aggregated Counting 转 : https://blog.csdn.net/cq_phqg/article/details/48417111 题解: 可以令n=1+2+2+3+3+.. ...