TCP 服务器加倍输入
TCP server doubling inputs
我目前正在使用 gevent 开发一个简单的 TCP 服务器。这是当前代码:
from gevent.server import StreamServer
SIZE = 1024
DISCONNECT_INPUT = "\q"
def clientSocket(socket, address):
print(f"[{address}] Connection established.")
socket.send(f"Welcome to the server. Type {DISCONNECT_INPUT} to exit.".encode())
dataList = []
while True:
message = socket.recv(SIZE).decode()
if message:
if message == DISCONNECT_INPUT:
print(f"[{address}] Client closed connection.")
break
else:
print(f"[{address}]: {message}")
dataList.append(message)
socket.send(message.encode())
else:
print(f"[{address}] Client disconnected.")
break
server = StreamServer(("127.0.0.1", 5000), clientSocket)
print("Listnening for connections...")
server.serve_forever()
连接处理得很好,但输入是按字符而不是按行接收的。例如,如果我通过 telnet 连接并尝试键入“这是一条消息”,服务器会接收并读取我键入的每个字符,而不是等待完整的内容。为了更好地说明我的意思:
这是在 telnet 上输入“这是一条消息”后服务器的样子:
这就是 telnet window 的样子:
(服务器是回显服务器,因此 telnet 看起来像它的样子。)
我不知道究竟是什么原因造成的。这是 telnet 问题还是代码问题?
您可以使用 Wireshark 等工具检查真正发送的内容。
我认为 telnet 会尽快发送,以允许使用需要单次击键的应用程序,例如编辑器或 nethack。
TCP 是一种流协议,而不是一种消息协议,因此无法保证保留消息边界。如果要逐行回显,则必须收集直到收到 \n.
我目前正在使用 gevent 开发一个简单的 TCP 服务器。这是当前代码:
from gevent.server import StreamServer
SIZE = 1024
DISCONNECT_INPUT = "\q"
def clientSocket(socket, address):
print(f"[{address}] Connection established.")
socket.send(f"Welcome to the server. Type {DISCONNECT_INPUT} to exit.".encode())
dataList = []
while True:
message = socket.recv(SIZE).decode()
if message:
if message == DISCONNECT_INPUT:
print(f"[{address}] Client closed connection.")
break
else:
print(f"[{address}]: {message}")
dataList.append(message)
socket.send(message.encode())
else:
print(f"[{address}] Client disconnected.")
break
server = StreamServer(("127.0.0.1", 5000), clientSocket)
print("Listnening for connections...")
server.serve_forever()
连接处理得很好,但输入是按字符而不是按行接收的。例如,如果我通过 telnet 连接并尝试键入“这是一条消息”,服务器会接收并读取我键入的每个字符,而不是等待完整的内容。为了更好地说明我的意思:
这是在 telnet 上输入“这是一条消息”后服务器的样子:
这就是 telnet window 的样子:
(服务器是回显服务器,因此 telnet 看起来像它的样子。)
我不知道究竟是什么原因造成的。这是 telnet 问题还是代码问题?
您可以使用 Wireshark 等工具检查真正发送的内容。 我认为 telnet 会尽快发送,以允许使用需要单次击键的应用程序,例如编辑器或 nethack。
TCP 是一种流协议,而不是一种消息协议,因此无法保证保留消息边界。如果要逐行回显,则必须收集直到收到 \n.