二进制字节流的拆解包:
1. 使用 struct
-
#获取字节流的 包大小域
-
PkgSizeStruct = struct.Struct("!l") 预定义一个存储格式一定的结构体对象。
-
size_data = sock.recv(PkgSizeStruct。size)现充socket中读出包大小的字节流
-
PkgSize = PkgSizeStruct.unpack(size_data)[0] 把字节流转化为预定格式, 实现方式为通过预定义的结构体
-
-
#获取其余数据
-
data = bytearray() #定义缓冲区
-
while True:
-
buffer = sock.recv(1024) #每次读取1K字节
-
result.extend(buffer) #源源不断的放到缓冲区内
或者用
-
ack = struct.pack('=3HI', fMagic, fSeq, fCmd, 0)
-
fMagic, fSeq, fCmd, fBodySize = struct.unpack('=3HI', fHead)
或者利用 pickle 把对象序列化
点击(此处)折叠或打开
-
data = pickle.dumps("hello",3) # 3位序列化的协议版本号, data 为 bytes 类型。
-
sock.sendall(data)
-
------------------------------------
-
pickle.loads(data) --> "hello"
##########################################################
-
with 对象 as 别名:
-
suite
-
-
对象对应的类定义中应该存在 _enter_(self)定义,其返回一个明确的对象(可以使任意类型), 即别名对应的这个明确的对象, 这个对象即可在suite中使用。
-
-
举例: with 的对象为 MyObj的类型, 在 _enter_()实现中 return 了一个 socket 类型对象, 那么别名就代表的是这个socket对象, 那么通过别名.send/recv 就可以进行socket收发了。
-
-
同样对应 _enter_(self) 应该也有 _exit_(self, *ignore)的定义, 用于 with 的作用域结束时调用。例如实现 socket.close动作。
socket 、socketserver 两个类可以被继承, 开发自定义类型。函数和方法可参考帮助文档。
基本上和C socket相同。
阅读(2061) | 评论(0) | 转发(0) |