1

I started a project that aims to do a multiplayer Tic-Tac-Toe through sockets. In the first step of this project, I've coded the server and the client so that players can connect to server. But for some reason the server is only accepting one connection.

So if I turn on the server, and I connect one client, the server will do what I programmed, but if I then connect other client in sequence, the server does nothing. It seems that the server only applies what I've done for the first connection.

I really don't know the root of this problem.

There is my 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()

Screenshot when I turn on the server:

Screenshot when the first client connects to server

Screenshot when the second client connects to server

Aitor Ruiz
  • 11
  • 1

1 Answers1

0

Looks like you imported threading on your server code but never used it. In order to serve multiple clients from your server, you will either need to create a new thread for each connection, or use async IO.

You can try the threading approach by changing

self.server_manager(client_socket)

in receive_connection to

threading.Thread(target=self.server_manager, args=(client_socket,)).start()
Leo
  • 1,273
  • 9
  • 14