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

Mil*_*ica 3 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()
Run Code Online (Sandbox Code Playgroud)

和客户:

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() 
Run Code Online (Sandbox Code Playgroud)

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

received: (Message1)
received: (Message2)
Run Code Online (Sandbox Code Playgroud)

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

received: (Message1)(Message2)
Run Code Online (Sandbox Code Playgroud)

这是否与接收到的数据大小、某种缓冲区相关,或者是否与超时相关,或者其他什么?

Lou*_*ues 5

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

  • +1。另一种选择是在消息之间使用分隔符(例如“\r\n\r\n”是常见的选择)。 (2认同)