创建一个小的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
我知道它来自端口,因为当我对其进行更改时,它将再次起作用,直到我不再使用两次相同的端口为止。
但是有没有办法重置所有使用的端口并使其再次可用?
答案 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()