簡體   English   中英

python socket:發送和接收16個字節

[英]python socket: sending and receiving 16 bytes

請參見下面的修改。

我有兩個通過套接字進行通信的程序。 我正在嘗試將數據塊從一個發送到另一個。 這一直在處理某些測試數據,但對其他測試數據卻失敗。

s.sendall('%16d' % len(data))
s.sendall(data)
print(len(data))

發送到

size = int(s.recv(16))
recvd = ''
while size > len(recvd):
    data = s.recv(1024)
    if not data: 
        break
    recvd += data
print(size, len(recvd))

在一端:

s = socket.socket()
s.connect((server_ip, port))

和另一個:

c = socket.socket()
c.bind(('', port))
c.listen(1)
s,a = c.accept()

在我的最新測試中,我發送了7973903字節塊,接收器報告的大小為7973930。

為什么接收到的數據塊減少了27個字節?

還有其他問題嗎?

Python 2.7或2.5.4(如果重要)。

編輯:啊哈-我可能正在閱讀發送緩沖區的末尾。 如果剩余字節數少於1024,我應該只讀取剩余字節數。 是否有用於此類數據傳輸的標准技術? 我感覺自己正在重新發明輪子。

EDIT2:我正在閱讀系列中的下一個文件。 我正在發送file1,最后一個塊是997個字節。 然后我發送file2,因此file1末尾的recv(1024)讀取file2的前27個字節。

我將就如何做得更好開始另一個問題。

感謝大家。 詢問和閱讀評論有助於我集中精力。

一,行

size = int(s.recv(16))

可能讀取的字節數少於16個,我不太可能授予,但是可能取決於網絡緩沖區的對齊方式。 recv()調用參數是一個最大值 ,它是您願意接收多少數據的限制。 但是您可能只會收到一個字節。 通常,一旦至少有一個字節到達,操作系統(可能取決於操作系統以及CPU的繁忙程度)就會給您控制權,這可能是在等待另外幾毫秒后(如果第二個數據包到達時再發送一些數據),以便它只需喚醒您一次,而不是兩次。

因此,您可能想說(做最簡單的循環;可能有其他變體):

data = ''
while len(data) < 16:
    more = s.recv(16 - len(data))
    if not more:
        raise EOFError()
    data += more

實際上,這幾乎是每個人都在重新發明的輪子,因為它經常需要。 而且您自己的代碼需要第二次: while循環需要它的recv()遞減計數,要求越來越小的限制,直到最終它收到的確是所承諾的字節數,而沒有更多。

暫無
暫無

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

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