如何编写一个 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()
我想设置一个简单的回显服务器,它只回显客户端发送给它的任何内容。但是,目前服务器在回显第一个客户端消息后会断开连接(服务器套接字关闭)。我希望能够 "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()