[英]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.