我正在尝试建立一个客户端和服务器,客户端将一个字符串发送到服务器,然后服务器发回一个响应。
这是我客户端的方法
def send(self):
s = socket.socket()
s.connect(("127.0.0.1", 5012))
message = bytes("Send!", "utf-8")
s.send(message)
data = s.recv(1024)
data = str(data, "utf-8")
print(data)
s.close()
这是服务器中等待客户端消息的方法。
def listener(self):
print("Startet")
s = socket.socket()
s.bind(("127.0.0.1", 5012))
s.listen(1)
while True:
c, addr = s.accept()
while True:
data = c.recv(1024)
data = str(data, "utf-8")
print(data)
c.send(bytes("OK", "utf-8"))
c.close()
运行这个我得到:
Startet
Send!
Exception in thread Thread-1:
Traceback (most recent call last):
File "C:\Anaconda3\lib\threading.py", line 914, in _bootstrap_inner
self.run()
File "C:\Anaconda3\lib\threading.py", line 862, in run
self._target(*self._args, **self._kwargs)
File "C:\workspace\Server.py", line 41, in listener
data = c.recv(1024)
ConnectionAbortedError: [WinError 10053]
An established connection was disconnected by the software on the hostcomputer
它打印出Send!,所以至少收到消息,然后突然停止。服务器应该能够一直运行,并采取 来自客户端的任意数量的消息发送功能。
答案 0 :(得分:0)
客户端执行send(),然后立即执行recv(),而不检查数据是否可用(例如,使用accept())。如果套接字是非阻塞的,则recv()会立即返回(或者由于其他原因而除外)。打印空字符串并关闭套接字。这就是服务器提供ConnectionAbortedError的原因,客户端已经关闭了连接。通过在客户端recv()周围添加try / except来检查这一点。