所以,我有一個服務器用socket.send()方法向客戶端發送響應。在服務器連續兩次使用socket.send()方法時,客戶端用於接收服務器響應的socket.recv()方法會不時地在localhost上測試代碼,從而將兩個不同的消息合併爲一個。 例如: 服務器:Python套接字發送速度比接收器更快
from socket import *
serverSocket = socket(AF_INET, SOCK_STREAM)
serverPort = 13005
serverSocket.bind(('', serverPort))
serverSocket.listen(1)
connection_socket, client_ip = serverSocket.accept()
connection_socket.send('Message one')
connection_socket.send('Message two')
客戶:
from socket import *
serverName = 'localhost'
serverPort = 13005
clientSocket = socket(AF_INET, SOCK_STREAM)
clientSocket.connect((serverName, serverPort))
print clientSocket.recv(1024)
print clientSocket.recv(1024)
從運行在客戶端,在隨機時間的結果,是
Message oneMessage two
除非我把睡眠(0.1)兩者之間send()。有沒有辦法避免使用睡眠?我是否需要在recv()方法中輸入準確的字節數?
否,您需要創建一個協議來在原始字節流上分隔消息(或重新使用現有協議)。 SOCK_STREAM套接字就像它說的那樣,是一個流。發送可以分組或甚至分裂(一次發送產生多個recv)。天真的例子讓你明白:你可以用字節大小來預先填充每條消息,因此接收者知道需要多少字節。 – spectras
順便說一句,睡覺並不能解決你的問題。即使使用「sleep(15)」,如果網絡延遲或者數據包丟失並重新傳輸,您將在一個'recv'中獲得所有數據。 – spectras