我的服务器(Python套接字)有什么问题?



我开始了一个旨在通过插座做多人井字游戏的项目。在这个项目的第一步,我已经编码了服务器和客户端,以便玩家可以连接到服务器。但是由于某些原因,服务器只接受一个连接。

因此,如果我打开服务器,并连接一个客户端,服务器将执行我编程的操作,但如果我随后依次连接其他客户端,服务器什么也不做。似乎服务器只应用我为第一次连接所做的。

我真的不知道这个问题的根源。

有我的client.py:

import socket
import time
class Client(object):
def __init__(self, ip="192.168.0.15", port=5000):
self.ip = ip
self.port = port
self.address = (self.ip, self.port)
def start(self):
self.client_manager()
def client_manager(self):
client_socket = self.connect_to_server()
try:
client_username = str(input(">> Enter your username: "))
client_socket.send(client_username.encode("UTF-8"))
print("You're welcome, {}! You've connected successfully to server.".format(client_username))
players_quantity = int(client_socket.recv(1024).decode("UTF-8"))

while players_quantity == 1:
self.check_players_quantity(players_quantity, client_socket)
time.sleep(2)
except:
print("An error ocurred on client.")
def check_players_quantity(self, players_quantity, client_socket):
if players_quantity == 1:
print("You've connected to server. One player remaining, please wait...")
elif players_quantity == 2:
print("You've connected to server. All two players are ready, waiting for server...")
client_socket.send("READY".encode("UTF-8"))
def connect_to_server(self):
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(self.address)

return client_socket
if __name__ == "__main__":
client = Client()
client.start()

And my server.py:

import socket
import threading
class Server(object):
def __init__(self, ip="192.168.0.15", port=5000):
self.ip = ip
self.port = port
self.address = (self.ip, self.port)
self.clients_list = []
self.users_list = []
def start(self):
self.receive_connection()
def server_manager(self, client_socket):
client_username = client_socket.recv(1024).decode("UTF-8")
self.users_list.append(client_username)
print("{} has connected to server.".format(client_username))
players_quantity = str(len(self.clients_list))
client_socket.send(players_quantity.encode("UTF-8"))
received_data = client_socket.recv(1024).decode("UTF-8")
if received_data == "READY":
print("All two players are ready. Type 'start' to start the game.")
data = str(input(">> "))
def receive_connection(self):
server_socket = self.initiliaze_socket()
try:
while True:
client_socket, address = server_socket.accept()
self.clients_list.append(client_socket)
print("Connection received from '{}:{}'.".format(address[0], address[1]))
self.server_manager(client_socket)
except:
print("An error ocurred on server!")
def initiliaze_socket(self):
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(self.address)
server_socket.listen()
print("Server is running on '{}:{}'. Waiting for connections.".format(self.address[0], self.address[1]))
return server_socket
if __name__ == "__main__":
server = Server()
server.start()

打开服务器时的截图:

第一个客户端连接到服务器时的屏幕截图

第二个客户端连接到服务器时的屏幕截图

看起来您在服务器代码中导入了threading,但从未使用过它。为了从您的服务器服务多个客户端,您需要为每个连接创建一个新线程,或者使用async IO。

您可以通过更改

来尝试线程方法
self.server_manager(client_socket)

在receive_connection到

threading.Thread(target=self.server_manager, args=(client_socket,)).start()

最新更新