Python套接字 - WinError 10054

时间:2016-05-20 10:57:10

标签: python sockets

我正在尝试建立一个客户端和服务器,客户端将一个字符串发送到服务器,然后服务器发回一个响应。

这是我客户端的方法

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!,所以至少收到消息,然后突然停止。服务器应该能够一直运行,并采取 来自客户端的任意数量的消息发送功能。

1 个答案:

答案 0 :(得分:0)

客户端执行send(),然后立即执行recv(),而不检查数据是否可用(例如,使用accept())。如果套接字是非阻塞的,则recv()会立即返回(或者由于其他原因而除外)。打印空字符串并关闭套接字。这就是服务器提供ConnectionAbortedError的原因,客户端已经关闭了连接。通过在客户端recv()周围添加try / except来检查这一点。