【问题标题】:TCP server doubling inputsTCP 服务器加倍输入
【发布时间】:2021-08-28 15:45:27
【问题描述】:

我目前正在使用 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 窗口的样子:

(服务器是一个回显服务器,因此 telnet 看起来如此。)

我不知道究竟是什么原因造成的。这是 telnet 问题还是代码问题?

【问题讨论】:

  • 您也可以添加您的客户端代码吗?
  • 没有客户端代码,我是通过telnet连接的。

标签: python server tcp


【解决方案1】:

您可以使用 Wireshark 之类的工具检查实际发送的内容。 我认为 telnet 会尽快发送,以允许使用需要单次击键的应用程序,例如编辑器或 nethack。

TCP 是流协议,而不是消息协议,因此无法保证保留消息边界。如果要逐行回显,则必须收集直到收到\n。

【讨论】:

  • 我认为您可能是对的,我在 ubuntu VM 上使用 netcat 对其进行了测试,它按预期工作,所以这很可能是一个 telnet 问题。
猜你喜欢
  • 2017-01-06
  • 2011-07-13
  • 2012-08-26
  • 2017-03-07
  • 2012-12-26
  • 2013-07-01
  • 2017-12-23
  • 2010-11-29
  • 2011-03-18
相关资源
最近更新 更多