在python的socket程式設計中,如果使用socket recv()接收資料,到下次接收的時候又是上次沒接收完的資訊,我怎麼才可以再次重新接收資料?

時間 2021-05-11 14:56:07

1樓:大峰子

最傻的辦法是客戶端輸入完所有資訊後直接斷開socket,然後伺服器端recv就停止阻塞並往下執行了;或者利用尾標識法,接受乙個整個資訊,比如「how are you ?\exit」(最後的「\exit」)是這整個資訊的尾標識。繼續完善的話,可以分別在伺服器與客戶端加入首席資訊官度的限制

2樓:路上乙隻汪

資料定義一半前面會有幾個位元組給定義要傳過來的資料大小的吧。

假設是這個,你先收取12個,得到這個資料的長度為size.

buff1=None

while True: #當剩下的資料大於1024時,繼續收1024大小;當剩下的資料小於1024時,收剩下的大小並退出迴圈

if (size-len(buff1))>1024 :

d3 = s.recv(1024)

buff1 = buff1 + d3

else :

d3 = s.recv(size-len(buff1))buff1 = buff1 + d3

break

你也可以加乙個收取次數限制,如果收取N次都沒收到size,可能是出錯斷網了,退出迴圈並報錯

3樓:yegle

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

4樓:

傳送端使用 .send(content)

假設len(content) = buffersize當接收端使用 .recv(buffersize) 接收資料時,因為網路分包的原因,在這個函式結束呼叫的時候,不一定能接收到buffersize大小的資料。如果想要接到完整的content,需要在接收端自己計數。

這個時候,再次呼叫recv(100),接受的肯定有上次沒有讀完的content的內容。

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

5樓:王森

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

6樓:

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

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

7樓:

while

True

:buf

=socket

.recv

(1024)if

notlen

(buf

):break

printbuf

8樓:楊金峰

recv(555)指定了recv函式每次最多只能接收節,如果client上次傳送來的資料超過了節,則超過的不分會留在核心緩衝區中,下次呼叫recv的時候會繼續讀剩餘的位元組。好的做法是針對recv寫乙個迴圈。

在Ubuntu系統下,用Python語言編寫了乙個學生資訊登記系統,登記的資訊在退出終端後會清空

有時候缺點耐心 sudo apt get install mysql server 5.7 pip3 install mysql connector python linux minit上基本搞定,ubuntu上應該不差太多,mysql connector python這個驅動在mysql官網上有文...

socket的ReceiveBufferSize屬性和呼叫Receive用的byte 大小要對應嗎

我是阿柒啊 不需要,ReceiveBufferSize是緩衝區,socket對端傳送的資料存放在緩衝區。應用程式呼叫read 或receve 時,從socket的ReceiveBufferSize中把資料copy到應用程式的byte中,如果byte ReceiveBufferSize,一次性就可以把...

在python中的randrange函式和uniform函式的區別是什麼?

無關風月 函式簽名說的已經比較清楚了啊 In 7 random.randrange?Signature random.randrange start,stop None,step 1,int maxwidth 9007199254740992L Docstring Choose a random i...