python的粘包和分包

twisted的Protocol.datareceived()能处理接收到的原始数据,既然是原始的,就可能和应用层定义的“包”有差异,即粘包和分包难以避免

看一段处理粘包的代码:

#!/usr/bin/env python
#coding=utf-8 

import struct

def mypack(data):
    pack_format = ‘2I%ds‘
    return struct.pack(pack_format % len(data),100,len(data),data)
    
#简单解码
def myunpack(data):
    pack_format = ‘2I%ds‘ % (len(data) - 2*4)
    return struct.unpack(pack_format,data)
 
#解码+处理粘包
def myunpack2(data):
    pack_format = ‘2I%ds‘ % (len(data) - 2*4)
    (version,length,str) = struct.unpack(pack_format,data) 
    
    if 0 < ((len(data) - 2*4)-length):
        #如果有粘包,则将后续字段,放入一个字符串中
        pack_format = ‘2I%ds%ds‘ % (length, (len(data) - 2*4)-length)
        return struct.unpack(pack_format,data) 
    else:
        return (version,length,str)
 
 #测试
if __name__ == ‘__main__‘:  

    import json
    str = {‘a‘:1111,‘b‘:[],‘c‘:‘asfasdf‘}
    str = json.dumps(str)
      
    a = mypack(str)
    print a
    b = myunpack2(a+a+a)
    print b
    while 3<len(b):
        b = myunpack2(b[3])
        print b

分包相对简单,即对最后一次输出的 b做判断

    if b[1] > len(b[2]):
        #分包了,最后一次的数据放入临时变量中,等待下一个数据流一起处理
        pass

-----------------------------------------

python的unpack函数没有php的那般强大,php的unpack还可以支持类似 * (任意多个)的匹配模式

python的粘包和分包

时间: 2024-10-12 12:19:10

python的粘包和分包的相关文章

DELPHI高性能大容量SOCKET并发(四):粘包、分包、解包

DELPHI高性能大容量SOCKET并发(四):粘包.分包.解包 粘包 使用TCP长连接就会引入粘包的问题,粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾.粘包可能由发送方造成,也可能由接收方造成.TCP为提高传输效率,发送方往往要收集到足够多的数据后才发送一包数据,造成多个数据包的粘连.如果接收进程不及时接收数据,已收到的数据就放在系统接收缓冲区,用户进程读取数据时就可能同时读到多个数据包. 粘包一般的解决办法是制定通讯协议,由协议来规

【转载】socket的半包,粘包与分包的问题

http://zhaohuiopensource.iteye.com/blog/1541270 首先看两个概念: 短连接: 连接->传输数据->关闭连接    HTTP是无状态的,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接.    也可以这样说:短连接是指SOCKET连接后发送后接收完数据后马上断开连接. 长连接: 连接->传输数据->保持连接 -> 传输数据-> ... ->关闭连接. 长连接指建立SOCKET连接后不管是否使用都

TCP粘包和分包

什么是TCP粘包 引用:http://zgame.blog.51cto.com/6144241/1225333 扩展TCP的长连接和短连接 引用:http://www.cnblogs.com/beifei/archive/2011/06/26/2090611.html TCP短连接 我们模拟一下TCP短连接的情况,client向server发起连接请求,server接到请求,然后双方建立连接.client向server发送消息,server回应client,然后一次读写就完成了,这时候双方任何一

粘包 拆包(分包) 半包

粘包.拆包.半包理解 TCP是一种面向流的网络层传输协议,在使用TCP作为传输层协议时,可保证数据的顺序性和可靠性. 应用层在使用TCP协议传输数据时,可采取两种方式: 短链接:客户端同服务端完成一次通信(客户端只发送一次请求,并接收到响应),关闭TCP连接: 长连接:客户端持续同服务端进行通信(客户端不停的发送请求,并接收到响应),不关闭TCP连接: 使用短连接时,可通过TCP连接是否关闭判断是否完成了一次请求响应通信.但每次请求必须重建TCP连接,会导致请求响应一会会存在一个TCP握手延时.

Python socket粘包问题

server端配置: import socket,subprocess,struct from socket import * server=socket(AF_INET,SOCK_STREAM) server.bind(('127.0.0.1',8080)) server.listen(5) while True: conn,client_addr=server.accept() while True: try: cmd=conn.recv(1024) if len(cmd) == 0:bre

python 解决粘包现象(struct模块)

一. struct模块 该模块可以把一个类型,转换为固定长度的bytes import struct lst = [1,2,4,3,5,] lst1 = [1,2,4,3,5,7,8,9,] a = struct.pack('i',len(lst))#将列表的长度转化为固定的4字节 b = struct.pack('i',len(lst1)) print(a,len(a)) print(b,len(b)) 符号对应的类型以及转换之后的长度表 : struct模块实现大文件传输 : #server

netty之粘包分包的处理

1.netty在进行字节数组传输的时候,会出现粘包和分包的情况.当个数据还好,如果数据量很大.并且不间断的发送给服务器,这个时候就会出现粘包和分包的情况. 2.简单来说:channelBuffer在接收包的时候,会在当时进行处理,但是当数据量一大,这个时候数据的分隔就不是很明显了.这个时候会出现数据多了或者少了的情况 3.处理的方式,一般就是编解码.自己定义数据:数据长度+数据.这种简单的方式来实现.在server进行解密操作. 4.具体的实现过程 a.客户端进行编码 package com.t

python/socket编程之粘包

python/socket编程之粘包 粘包: 只有TCP有尿包现象,UDP永远不会粘包. 首先需要掌握一个socket收发消息的原理 发送端可以是1k,1k的发送数据而接受端的应用程序可以2k,2k的提取数据,当然也有可能是3k或者多k提取数据,也就是说,应用程序是不可见的,因此TCP协议是面来那个流的协议,这也是容易出现粘包的原因而UDP是面向笑死的协议,每个UDP段都是一条消息,应用程序必须以消息为单位提取数据,不能一次提取任一字节的数据,这一点和TCP是很同的.怎样定义消息呢?认为对方一次

Python网络编程03/ low版解决粘包问题

目录 Python网络编程03/ low版解决粘包问题 1.操作系统的缓存区 2.基于TCP协议的socket循环通信 2.1 服务端(server) 2.2客户端(client) 3.基于TCP协议的socket链接+循环 通信 3.1服务端(server) 3.2 客户端(client) 4.基于TCP协议的socket应用实例:执行远程命令 4.1服务端(server) 4.2客户端(client) 5.粘包现象 5.1服务端(server) 5.2客户端(client) 5.3展示收发问