使用Python在套接字上发送二进制数据

ubi*_*biQ 15 python sockets

我想通过SPDY协议编写一些基本请求.该协议将您发送的帧定义为由非常特定长度和字节顺序的二进制数据组成.

我只编写了通过套接字(HTTP)发送字符串的小程序.例如,如何实现SPDY控制帧头?我已经尝试使用bitstring库和numpy来控制控件帧头的所有不同部分的大小,但是没有任何东西真正起作用.python的当前SPDY库使用cython和C数据类型,我发现它非常不可预测.我想知道如何使用纯python构建简单的请求,或者我是如何构建一些与协议定义完全相似并通过套接字发送的东西?

fre*_*ish 24

一般bytearray上课会成为你的朋友(如果我理解你的问题).你可以通过socket发送它:

my_bytes = bytearray()
my_bytes.append(123)
my_bytes.append(125)

// my_bytes is b'{}' now

s.send(my_bytes)
Run Code Online (Sandbox Code Playgroud)

遵循协议规范并逐字节创建.这在收到数据时也有效:

data = s.recv(2048)
my_bytes = bytearray(data)
Run Code Online (Sandbox Code Playgroud)

我对SPDY协议知之甚少,但是例如控制位是消息中的第一位(不是字节).您可以my_bytes通过二进制AND 检索它,例如:

control_frame = my_bytes[0] & 128
Run Code Online (Sandbox Code Playgroud)

这是因为12810000000二进制的,因此二进制AND只给你第一位(记住每个字节有8位,这就是为什么我们有7个零).

这就是手动完成的事情.当然我建议使用一些库,因为编写一个合适的协议处理程序会花费很多时间,你可能会发现它很困难而且它可能效率不高(当然,这取决于你的需要).