如何在python中重置套接字地址使用? (解决WinError 10048)

时间:2019-05-30 15:28:01

标签: python python-3.x sockets

创建一个小的pygame程序后,我希望使其变得多人友好,并有可能在本地玩。我的目标是允许我的世界中有两个独立的玩家!

因此,我基本上已经尝试学习如何使用python的套接字模块。

好的,让我们开始吧,我的第一个尝试是在基本服务器上连接客户端。

我遵循了一个非常不错的教程,并基于此结构获得了最终代码:

#server.py

import socket
from threading import Thread

class Serv(Thread):


    def __init__(self, conn):
        Thread.__init__(self)
        self.conn = conn

    def run(self):
        data = self.conn.recv(1024)
        data = data.decode("utf8")
        print(data)


host, port = ('', 8486)

socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.bind((host, port))

run = True

while run :
    socket.listen(5)
    conn, adress = socket.accept()

    thread_serv = Serv(conn)
    thread_serv.start()
conn.close()
socket.close()

然后:

#client.py

import socket

host, port = ('localhost', 8486)



try:
    socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    socket.connect((host, port))
    print("You're in !")

    data = "bonjour"
    data = data.encode("utf8")
    socket.sendall(data)

except ConnectionRefusedError:
    print("There is no server to join !")
except :
    print("connexion lost...")
finally:
    socket.close()

我第一次运行这两个程序(首先是server.py,然后是client.py),一切正常。

但是当我第二次运行它时,控制台会返回我:

Traceback (most recent call last):
  File "C:\Users\Cédric\Documents\logiciels\python\By Sigmanificient\Tower\bin\serveur.py", line 20, in <module>
    socket.bind((host, port))
OSError: [WinError 10048] Une seule utilisation de chaque adresse de socket (protocole/adresse réseau/port) est habituellement autorisée
[Finished in 0.1s]

如果我为您翻译了最后一行,则处理如下问题: Only one use of each socket address ( protocol/network address/port) is usually allowed

我知道它来自端口,因为当我对其进行更改时,它将再次起作用,直到我不再使用两次相同的端口为止。

但是有没有办法重置所有使用的端口并使其再次可用?

1 个答案:

答案 0 :(得分:1)

您的代码尝试多次调用listen。错了listen应该被调用一次,每个新连接只需要调用accept。您的代码应为:

...
socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.bind((host, port))
socket.listen(5)

run = True

while run :
    conn, adress = socket.accept()

    thread_serv = Serv(conn)
    thread_serv.start()
conn.close()
socket.close()