如何编写一个 python 在第一次回显后不断开连接的回显服务器?

How to write a python echo server that doesn't disconnect after first echo?

我想设置一个简单的回显服务器,它只回显客户端发送给它的任何内容。但是,目前服务器在回显第一个客户端消息后会断开连接(服务器套接字关闭)。我希望能够 "chat" 与服务器连续进行,服务器只是回显我发送的几条连续消息而不会断开连接;例如:

"Hi there!"

"Echoing: Hi there!"

"How are you?"

"Echoing: How are you?"

"Cheers!"

"Echoing: Cheers!"

等等

目前我有以下代码:

server.py:

import socket

HOST = '127.0.0.1' 
PORT = 5000

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    conn, addr = s.accept()
    with conn:
        while True:
            data = conn.recv(1024)
            if not data:
                break
            conn.sendall(data)

client.py:

import socket

HOST = '127.0.0.1'
PORT = 5000

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    s.sendall(b'Hello, world')
    data = s.recv(1024)

print('Echoing: ', repr(data))

然而,服务器在回显第一条客户端消息后断开连接(可能是因为 if not data: break 语句)。

P.S。如果有任何可能需要的额外解释,我将不胜感激 - 此示例具有教育目的,因此我(仅)在获得代码 运行.

谢谢!

也许使用睡眠而不是休息

if not data:
    time.sleep(1)
    continue

你必须为此导入时间模块。

我将向您展示我创建的代码,然后向您介绍它:

服务器:

import socket

HOST = '127.0.0.1' 
PORT = 5000

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    conn, addr = s.accept()
    with conn:
        while True:
            data = conn.recv(1024)
            conn.sendall(data)

对于我删除的服务器:

if not data:
   break

它根本不适合我。如果您知道您的消息将小于 1024 字节(这里是),则没有必要。但是,如果您想要更长的消息,请将该值更改为更大的数字以适应。所以是的,你怀疑是那条线是对的。

客户:

import socket

HOST = '127.0.0.1'
PORT = 5000

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    print("Connected")
    while True:
        print("Sending data")
        s.sendall(b'Hello, world')
        print("Recieving data")
        data = s.recv(1024)
        print('Echoing: ', repr(data))

对于客户端,我只是将发送和接收过程添加到一个循环中。

注意事项:

这仅在通过终端 运行 时对我有效,我不知道您是否知道该怎么做,如果您知道,我们深表歉意,这里有一个 link 解释: https://www.wikihow.com/Use-Windows-Command-Prompt-to-Run-a-Python-File 我假设你使用 Windows。 您需要遵循 client.py 计划和 server.py 计划的流程。确保先 运行 server.py 程序。

这样会造成发送和接收的死循环。按 Ctrl+C 终止。

希望这能解决您的问题,您可以相应地编辑代码。如有其他问题,请发表评论,我会尽力回复您。

server.py:
import socket

HOST = '127.0.0.1' 
PORT = 5000

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    conn, addr = s.accept()
    with conn:
        while True:
            data = conn.recv(1024)
            if data.decode() == "bye":
                break
            conn.sendall(data)
            conn, addr = s.accept()