在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選項,為什麼還要在應用層加入心跳包機制??
※如何思考並解決網路編程中的問題?