Python套接字:如何一次只接收一条消息

时间:2014-02-10 18:50:56

标签: python sockets select

试着了解套接字是如何工作的。我正在使用我发现的修改过的测试选择服务器和客户端。这是服务器:

import socket

host = ''
port = 50000
backlog = 5
size = 1024
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host,port))
s.listen(backlog)
while 1:
    client, address = s.accept()
    running = 1
    while running:
        data = client.recv(size)
        print("received: "+data + "\n")
        if data:
            client.send(data)
            running = 0
        else:
            running = 0
    client.close()

客户:

import socket
import sys

host = 'localhost'
port = 50000
size = 1024
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))
sys.stdout.write('%')

s.send("(Message1)")


while 1:
    s.send("(Message2)")
    data = s.recv(size)
    sys.stdout.write(data)
    sys.stdout.write('%')
s.close() 

我期待服务器打印如下内容:

received: (Message1)
received: (Message2)

因为它们是单独发送的不同消息,而是我得到:

received: (Message1)(Message2)

这与收到的数据的大小,某种缓冲的东西有关,还是与超时有关,还是其他什么?

2 个答案:

答案 0 :(得分:4)

这是流套接字的完全正常行为,它是连续字节流,而不是消息流。您可以设想通过编码格式化消息,例如消息的len,然后是消息数据。然后,您可以使用这些指示解析收到的缓冲区。您也可以等到相应的')'到开头'('。

答案 1 :(得分:1)

套接字连接只提供一个数据流,因此服务器无法知道一条消息何时结束而下一条消息何时开始。

你的消息必须包含一些关于它们有多长的信息,所以要么使它们固定大小,要么相应地调整缓冲区长度,或者在它们前面添加一个大小值,在这种情况下服务器必须首先读取它然后从套接字中读取确切的字节数。

没有别的办法。