我想设置一个简单的回显服务器,该服务器仅回显客户端发送给它的任何内容。但是,当前服务器在回显第一条客户端消息后断开连接(服务器套接字关闭)。我希望能够与服务器连续地“聊天”,其中服务器只是回显我发送的多个连续消息而不会断开连接;例如:
“你好!”
“回声:你好!”
“你好吗?”
“回声:你好吗?”
“干杯!”
“呼应:干杯!”
等
当前我有以下代码:
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。我将不胜感激,可能还会有其他必要的解释-此示例具有教育意义,因此(并非仅)使代码运行后。
谢谢!
答案 0 :(得分:0)
也许用睡眠代替休息
if not data:
time.sleep(1)
continue
您必须为此导入时间模块。
答案 1 :(得分:0)
我将向您展示我创建的代码,然后与您讨论:
服务器:
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))
对于客户端,我只是将发送和接收过程添加到一个循环中。
注意事项:
这仅对通过终端运行的我有用,我不知道您是否知道该怎么做,如果您这样做,对不起,这里的链接解释了: https://www.wikihow.com/Use-Windows-Command-Prompt-to-Run-a-Python-File 我以为您使用Windows。 您将需要对client.py程序和server.py程序都遵循该过程。确保首先运行server.py程序。
这将导致发送和接收的无限循环。按Ctrl + C终止。
我希望这可以解决您的问题,并且您可以相应地编辑代码。如有其他问题,请发表评论,我会尽力与您联系。
答案 2 :(得分:0)
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()