在python的socket編程中,如果使用socket.recv()接收數據,到下次接收的時候又是上次沒接收完的信息,我怎麼才可以再次重新接收數據?

假設這在個循環體中,我想每次循環都重新接收數據

socket.send(post)

socket.send(playload)

data = socket.recv(555)

socket.setblocking(0)

print data


你想從socket里讀100個字元,但是只讀到50個字元。怎麼判斷是對方只發了50個字元,還是網路原因暫時只有50個字元發到對端?你並不知道。


while True:
buf = socket.recv(1024)
if not len(buf):
break
print buf


這樣寫可以? 當沒有接收內容的時候, buf = socket.recv(1024)這個會阻塞吧


如果通信比較不穩定,每次用不大的緩衝區,多次讀取,可以設置超時或重讀次數,也只能做到這樣


發送端使用 .send(content)

假設len(content) = buffersize

當接收端使用 .recv(buffersize) 接收數據時,因為網路分包的原因,在這個函數結束調用的時候,不一定能接收到buffersize大小的數據。如果想要接到完整的content,需要在接收端自己計數。這個時候,再次調用recv(100),接受的肯定有上次沒有讀完的content的內容。

舉這個例子,就是想說,對於接收端而言,只能看到連續的流,具體流的切分、讀取都是要自己控制的。


要麼去重讀 Unix Network Programming,裡面把作什麼假設、如何正確處理這些問題都說的很清楚了;

要麼去用現成的庫,比如 ProtocolBuffer 或者 ZeroMQ。


不行的,上面的代碼還是不能把消息讀完


recv(555)指定了recv函數每次最多只能接收555位元組,如果client上次發送來的數據超過了555位元組,則超過的不分會留在內核緩衝區中,下次調用recv的時候會繼續讀剩餘的位元組。好的做法是針對recv寫一個循環。


為什麼 我想要 接收使用socket.recv()接收數據,到下次接收的時候又是上次沒接收完的信息 為什麼我做不到呢 是不是我又一次獲取了 socket.recv()導致緩衝區東西重新更新了?


推薦閱讀:

想問下php的socket的工作流程是什麼?
怎麼理解TCP是面向連接的,HTTP基於TCP卻是無連接的?
TCP面向位元組流和報文段的關係是什麼?
TCP中已有SO_KEEPALIVE選項,為什麼還要在應用層加入心跳包機制??
如何思考並解決網路編程中的問題?

TAG:Python | 編程 | 計算機網路 | Socket |