2013-08-19 281 views
6

我期待通過SPDY protocol腳本的一些基本請求。該協議將您發送的幀定義爲由具有特定長度和字節順序的二進制數據組成。通過Python發送二進制數據通過套接字

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

回答

15

一般bytearray類將是你的朋友(如果我正確理解你的問題)。您可以通過套接字發送:

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協議,但例如控制位是消息中的第(不是字節)。您可以從my_bytes通過二進制和例如檢索:

control_frame = my_bytes[0] & 128 

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

這是如何手動完成的。當然,我建議使用一些庫,因爲編寫一個合適的協議處理程序將花費很多時間,您可能會覺得它非常困難,並且可能效率不高(取決於您的需求)。

+0

謝謝我正在研究這個問題,如何將bytearray中的位打印爲可讀字符串,如果我將每個字符串初始化爲0b ...? – ubiQ

+0

@ubiQ位? Bit只是0或1.如果你想打印一個bytearray,只需執行'print my_bytes'。 Python解釋器應該自動將每個字節轉換爲其字符串表示形式。請注意,它可能不是「可讀的」(取決於具體含義)。 – freakish

+0

我想在控制檯中以字符串形式讀取它,但它輸出的是原始二進制數據atm – ubiQ

0

您也可以使用struct module來用字符串定義標題格式並直接解析它。

要生成的分組:

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

FMT指示報頭格式( 'B I 4B' 僅僅是一個,顯然不工作爲您SPDY頭,例如)。不幸的是,你將不得不處理非字節分配的頭字段,可能是通過解析更大的塊,然後根據你的格式進行分割。

除此之外,爲了解析報頭:

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

unpacked_data將包含與所解析的數據元組。

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

相關問題