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网络编程,粘包、分包问题的解决的更多相关文章

  1. python网络编程--粘包解决方案 和 subprocess模块

    1.缓冲区:作用:将程序和网络解耦分为输入缓冲区, 输出缓冲区 每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区.write()/send() 并不立即向网络中传输数据,而是先 ...

  2. python 网络编程粘包解决方案2 + ftp上传 + socketserver

    一.struct 神奇的打包工具 struct 代码: import struct num = 156 #将int类型的数据打包成4个字节的数据 num_stru = struct.pack('i', ...

  3. python 网络编程 粘包问题

    1.粘包现象 TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾.   粘包出现原因 使用了优化方法(Nagle算法),将多次间隔较小.数据 ...

  4. python 网络编程---粘包

    一.什么是粘包?(只有在TCP中有粘包现象,在UDP中永远不会粘包) 黏包不一定会发生. 如果发生 了:1.可能是在客户端已经粘了 2.客户端没有粘,可能是在服务端粘了. 所谓的粘包问题:主要是是因为 ...

  5. 网络编程----粘包以及粘包问题的解决、FTP上传

    一.粘包现象 让我们基于tcp先制作一个远程执行命令的程序(1:执行错误命令 2:执行ls 3:执行ifconfig) 注意注意: res=subprocess.Popen(cmd.decode('u ...

  6. Python网络编程04 /recv工作原理、展示收发问题、粘包现象

    Python网络编程04 /recv工作原理.展示收发问题.粘包现象 目录 Python网络编程04 /recv工作原理.展示收发问题.粘包现象 1. recv工作原理 2. 展示收发问题示例 发多次 ...

  7. python网络编程:TCP通讯模板、粘包及解决方案、自定义报头

    一.TCP通讯模板 二.远程CMD程序 三.解决粘包问题 四.解决粘包问题2 一.TCP通讯模板 TCP客户端 import socket c = socket.socket() # 连接服务器 c. ...

  8. Python网络编程(2)-粘包现象及socketserver模块实现TCP并发

    1. 基于Tcp的远程调用命令实现 很多人应该都使用过Xshell工具,这是一个远程连接工具,通过上面的知识,就可以模拟出Xshell远程连接服务器并调用命令的功能. Tcp服务端代码如下: impo ...

  9. Python学习笔记【第十四篇】:Python网络编程二黏包问题、socketserver、验证合法性

    TCP/IP网络通讯粘包问题 案例:模拟执行shell命令,服务器返回相应的类容.发送指令的客户端容错率暂无考虑,按照正确的指令发送即可. 服务端代码 # -*- coding: utf- -*- # ...

  10. Python 网络编程(二)

    Python 网络编程 上一篇博客介绍了socket的基本概念以及实现了简单的TCP和UDP的客户端.服务器程序,本篇博客主要对socket编程进行更深入的讲解 一.简化版ssh实现 这是一个极其简单 ...

随机推荐

  1. wue父子通信和动态路由 还有点击事件直接赋值传参数

    这种直接在后面赋值 传值

  2. UML序列图的理解:

    UML序列图的理解:UML序列图是指一个对象的方法在处理过程中调用其他对象的图:重点是要突出调用其他对象的序列:

  3. 32-Python3 MySQL(mysql-connector)

    32-Python3 MySQL(mysql-connector) ''' 创建数据库连接 ''' import pymysql mydb = pymysql.connect( host = '127 ...

  4. Dotfuscator代码混淆工具的使用

    关于Dotfuscator,VS自带了一个社区版的源代码保护工具,不过它只有基本的混淆命名的功能.专业版功能很多,可以混淆流程,密字符串,加入水印,程序签名等. 工具/原料   Dotfuscator ...

  5. iOS UI进阶-3.0 核心动画

    Core Animation是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍,使用它需要先添加QuartzCore.framework和引入对应的框架<Quar ...

  6. android apk打包编译好的so

    加入so到apk有多种方法 1.build.gradle(Module)中android子项中加入以下代码,并将so放到到armeai/armeabi-v7a 子目录下 sourceSets { ma ...

  7. vue路由(一个包含重定向、嵌套路由、懒加载的main.js如下)and 路由跳转传参的query和params的异同

    import Vue from 'vue'import VueRouter from 'vue-router'import App from './App'Vue.use(VueRouter)cons ...

  8. js重定向跳转页面

    重定向方式: 1>  window.location ='www.baidu.com';    window.location='/';  window.location='/logout/'; ...

  9. node.js之爬虫

    nodejs爬取数据出现编码错误的问题 可以使用 superagent-charset 和 superagent 模块进行处理 var charset = require('superagent-ch ...

  10. Django配置xadmin后台模板之坑(一)

    环境: Python3.6 + Django2.0 + xadmin2.0 一.安装 1.首先安装就会有一个坑,很多教程的安装是直接在虚拟环境下使用 pip install xadmin 或者 pip ...