簡體   English   中英

使用Python在套接字上發送二進制數據

[英]Sending binary data over sockets with Python

我想通過SPDY協議編寫一些基本請求。 該協議將您發送的幀定義為由非常特定長度和字節順序的二進制數據組成。

我只編寫了通過套接字(HTTP)發送字符串的小程序。 例如,如何實現SPDY控制幀頭? 我已經嘗試使用bitstring庫和numpy來控制控件幀頭的所有不同部分的大小,但是沒有任何東西真正起作用。 python的當前SPDY庫使用cython和C數據類型,我發現它非常不可預測。 我想知道如何使用純python構建簡單的請求,或者我是如何構建一些與協議定義完全相似並通過套接字發送的東西?

通常bytearray類將是你的朋友(如果我正確理解你的問題)。 你可以通過socket發送它:

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

// my_bytes is b'{}' now

s.send(my_bytes)

遵循協議規范並逐字節創建。 這在收到數據時也有效:

data = s.recv(2048)
my_bytes = bytearray(data)

我對SPDY協議知之甚少,但是例如控制位是消息中的第一位 (不是字節)。 您可以通過二進制AND從my_bytes檢索它,例如:

control_frame = my_bytes[0] & 128

這是因為128是二進制的10000000 ,因此二進制AND只給你第一位(記住每個字節有8位,這就是為什么我們有7個零)。

這就是手動完成的事情。 當然我建議使用一些庫,因為編寫一個合適的協議處理程序會花費很多時間,你可能會發現它很困難而且它可能效率不高(當然,這取決於你的需要)。

您還可以使用struct模塊使用字符串定義標頭格式並直接解析它。

要生成數據包:

fmt = 'B I 4b'
your_binary_data = pack(fmt, header_data)
sock.sendall(your_binary_data)

其中fmt表示標題格式('BI 4b'只是一個,顯然不適合您的SPDY標題,例如)。 不幸的是,你必須處理非字節對齊的頭字段,可能是通過解析更大的塊然后根據你的格式划分它們。

除此之外,要解析標題:

unpacker = struct.Struct('B I 4b')
unpacked_data = unpacker.unpack(s.recv(unpacker.size))

unpacked_data將包含一個包含已解析數據的元組。

struct模塊執行Python值和表示為Python字符串的C結構之間的轉換。 我無法保證這種方法的效率,但它幫助我通過調整fmt字符串來解析不同的協議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM