2011-07-03 48 views
2

當我運行下面的Python代碼示例,從套接字讀取二進制數據在Python

tick = 0 
while True: 
    tick += 1 
    print tick 
    data = s.recv(1024) 
    if (tick == 1) and data: 
     print 'from client: %s' %(data) 
    elif (tick == 2) and data: 
     print 'from client: %s' %(data) 

我看,

1 
from client: client msg 
2 
from client: ? 
3 

我的直覺告訴我第二個呼叫到s.recv()實際上返回一些數據。我相當肯定客戶沒有發送'?'字符。

所以我修改代碼,希望能打印'數據」的第一個字節,

elif (tick == 2) and data: 
     print 'from client: %s' %(data) 
     print struct.unpack("!B", data) 

但後來我得到一個回溯指出:‘struct.error:解壓需要長度爲1的字符串參數’

struct包似乎是處理套接字數據的標準方式。但是,這種情況似乎很奇怪。我通過打印和看到「?」來直觀地接收數據並且代碼在條件中也有一個「和數據」,但我無法解壓縮。

是否有不同的方式來處理二進制數據從套接字?

回答

5
elif (tick == 2) and data: 
     print 'from client: %r' % data # (note 1) 
     print struct.unpack("!B", data[0]) # (note 2) 
  1. 打印像伊格納西奧表示建議。
  2. 你想解壓一個字節,所以給struct.unpack一個字節。
2

您可以通過調用repr()或使用%r格式說明符查看對象的原始表示。

+0

來自repr(數據)的值是'\ xaa \ xae'。我不應該能夠從這個解壓第一個字節嗎? – brooksbp

+0

是的,但它是2個字節。 –

0

這聽起來像你試圖解釋接收到的數據,而不確定接收到的數據代表什麼。您可以通過套接字發送ascii或utf-8編碼的unicode或二進制數據(整數或jpg或電影)。您的接收功能需要根據發送的內容量身定製。

如果你知道它是二進制的,你只是發送字節?因爲這是全部解包(「!B」,數據[0])(如TZ所建議的)會給你。如果是這樣,我相信答案是正確的。

您應該能夠使用len(data)來計算出接收的數量,並且應該確保您檢查是否有部分讀取(嘗試發送1025個字節並且只接收1024個字節)。