2017-07-06 100 views
0

所以,我有一個服務器用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()方法中輸入準確的字節數?

+1

否,您需要創建一個協議來在原始字節流上分隔消息(或重新使用現有協議)。 SOCK_STREAM套接字就像它說的那樣,是一個流。發送可以分組或甚至分裂(一次發送產生多個recv)。天真的例子讓你明白:你可以用字節大小來預先填充每條消息,因此接收者知道需要多少字節。 – spectras

+0

順便說一句,睡覺並不能解決你的問題。即使使用「sleep(15)」,如果網絡延遲或者數據包丟失並重新傳輸,您將在一個'recv'中獲得所有數據。 – spectras

回答

3

TCP是一種面向流的協議,不會逐個發送消息。一個簡單的方法來拆分郵件時,你可以在消息像\r\n

例年底成立分割字符串:

客戶:

#!/usr/bin/env python 

import socket 

TCP_IP = '127.0.0.1' 
TCP_PORT = 13005 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((TCP_IP, TCP_PORT)) 
s.send('Message one\r\n') 
s.send('Message two\r\n') 
s.close() 

服務器:

#!/usr/bin/env python 

import socket 

TCP_IP = '127.0.0.1' 
TCP_PORT = 13005 
BUFFER_SIZE = 20 # Normally 1024, but we want test 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((TCP_IP, TCP_PORT)) 
s.listen(1) 

conn, addr = s.accept() 
data = '' 
while 1: 
    data += conn.recv(BUFFER_SIZE) 
    if not data: break 
    if not data.endswith('\r\n'): 
     continue 
    lines = data.split('\r\n') 
    for line in lines: 
     print line 
    data = '' 
conn.close() 

如果您的消息很複雜且很長,您可以看到:Python Socket Receive Large Amount of Data

+0

毫無疑問,非常感謝! – Sfullez

相關問題