我有一個客戶端服務器通信,我寫了下面的服務器來處理傳入的消息,但如果消息比緩衝區大,它會丟失。如果消息大於緩衝區大小,我如何收到整個包?有沒有可能,或者我不得不強制客戶端(在最大緩衝區大小的請求下發送消息)在緩衝區大小內發送消息?Python的TCP緩衝區溢出
msg =''
while(True):
msg += server.recv(20480)
aSplit = msg.partition("</packet>")
#We received the full message
while(aSplit[ 1 ] == "</packet>"):
messagehandler( aSplit[ 0 ] + "</packet>")
msg = aSplit[ 2 ]
aSplit = msg.partition("</packet>")
當我發送100KB的消息時,我仍然失去了消息的結尾 –
這聽起來像是超出了操作系統的緩衝區來存儲數據。例如,如果您使用的是TCP連接,則可以發送的數據量是有限的 - 無論您的客戶在做什麼,它都可以一次讀取GB,這仍然會發生。你在發送端需要做的事情是注意'send()'的返回碼,它會告訴你發送了多少數據。你的應用程序必須繼續發送其餘的循環,直到它全部發送完畢。我建議你閱讀[Python sockets HOWTO](http://docs.python.org/2/howto/sockets.html)。 – Cartroo
特別是,閱讀[使用套接字]一節(http://docs.python.org/2/howto/sockets.html#using-a-socket) - 我引用:*現在我們來到主要的絆腳石的套接字 - send和recv在網絡緩衝區上運行。他們不一定處理你交給他們的所有字節(或者期望他們),因爲他們的主要焦點是處理網絡緩衝區。* – Cartroo