def __init__(self, send_udp_socket, recv_udp_socket, name):
        self.name = name.strip()
        print("Hi " + self.name.upper() + ", welcome to the battleship game!")

        self.running = True
        self.messages = []
        self.threads = []
        self.host_name = cm.server_host
        self.udp_server_port = cm.udp_server_port
        self.code = wc.WarCode()

        # prepare for UDP transmission (chat room)
        self.udp_send_socket = ss.RSASocket(send_udp_socket)
        self.udp_recv_socket = ss.RSASocket(recv_udp_socket)

        # thread to handle messages reception
        msg_reception_t = threading.Thread(
            target=self.handle_udp_msg_reception)
        msg_reception_t.daemon = True
        msg_reception_t.start()
        self.threads.append(msg_reception_t)

        # thread to handle messages display
        msg_handler_t = threading.Thread(target=self.handle_udp_msg_display)
        msg_handler_t.daemon = True
        msg_handler_t.start()
        self.threads.append(msg_handler_t)
Ejemplo n.º 2
0
def main():
    global server_quitting  # for the future
    threads = []
    game_server = None

    try:
        server_quitting = False

        # this is to verify if the server is up (UPD)
        t = threading.Thread(target=ping_response)
        t.start()
        threads.append(t)

        maximum_connected = cm.maximum_connected
        server_socket = socket(AF_INET, SOCK_STREAM)
        server_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
        server_socket.bind(('', cm.tcp_server_port))  # game socket
        server_socket.listen(maximum_connected)

        chat_socket = socket(AF_INET, SOCK_DGRAM)
        chat_socket.bind(('', cm.udp_server_port))  # chat room socket
        chat_socket = ss.RSASocket(chat_socket)

        # create the game server
        game_server = gs.TheGameServer(maximum_connected, chat_socket)

        # entry door for incoming players
        while not server_quitting:
            playersocket, addr = server_socket.accept()
            if (not server_quitting):
                ss_socket = ss.RSASocket(playersocket)
                t = threading.Thread(target=prepare_player,
                                     args=(ss_socket, game_server))
                t.start()
                threads.append(t)
                print("New player registered and waiting for more")
            else:
                # no more connections allowed
                playersocket.send("no more connections allowed".encode())
                playersocket.close()
    except KeyboardInterrupt:
        if (game_server):
            game_server.quit()
        game_down = True
        print("Keyboard Interrupt. Time to say goodbye!!!")
    except Exception as e:
        print(e)
        traceback.print_exc(file=sys.stdout)
    finally:
        for t in threads:
            t.join()
        if (game_server):
            game_server.quit()
        print("Waiting for all active games to finish")
    print("The end")
    sys.exit(0)
Ejemplo n.º 3
0
def get_new_socket(player_socket):
    global PORT
    PORT += 1
    port_min = cm.tcp_server_min_port
    port_max = cm.tcp_server_max_port
    tcp_port = (port_min + PORT) % port_max

    temp_socket = socket(AF_INET, SOCK_STREAM)
    temp_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)

    try:
        player_socket.send(str(tcp_port))
        temp_socket.bind(('', tcp_port))
        temp_socket.listen(15)
        new_player_socket, address = temp_socket.accept()
    except socket.timeout:
        print(
            "Socket timeout. Port may have been used recently. wait and try again!"
        )
        return None, tcp_port
    except:
        print("Socket error. Try again")
        return None, tcp_port
    finally:
        temp_socket.close()
    return ss.RSASocket(new_player_socket), address
Ejemplo n.º 4
0
    def set_connections_threads(self):
        print("Connecting server to port ..." + str(self.tcp_port))
        temp_socket = socket(AF_INET, SOCK_STREAM)
        temp_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
        temp_socket.connect((self.host_name, self.tcp_port))

        temp_socket = ss.RSASocket(temp_socket)
        temp_socket.send(self.name)

        # preparing new port
        plain_socket = socket(AF_INET, SOCK_STREAM)
        plain_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
        self.sslsocket = ss.RSASocket(plain_socket)  # encrypted socket

        error = True
        while error:
            try:
                port = int(temp_socket.recv(1024))
                self.sslsocket.connect(
                    (self.host_name, port))  # connect to the new port
                error = False
            except Exception as e:
                print(e)
                traceback.print_exc(file=sys.stdout)
                return False

        temp_udp_port = randint(2000, 60000)
        temp_udp_server_socket = socket(AF_INET, SOCK_DGRAM)
        temp_udp_server_socket.bind(('', temp_udp_port))

        # to find out what port is assigned to the udp sender socket
        temp_send_udp_client_socket = socket(AF_INET, SOCK_DGRAM)
        temp_send_udp_client_socket.sendto("Test".encode(),
                                           (cm.server_host, temp_udp_port))

        _, chat_sending_address = temp_udp_server_socket.recvfrom(1024)
        self.sslsocket.send(str(chat_sending_address))
        self.sslsocket.recv(1024)

        # to find out what port is assigned to the udp receiver socket
        temp_recv_udp_client_socket = socket(AF_INET, SOCK_DGRAM)
        temp_recv_udp_client_socket.sendto("Test".encode(),
                                           (cm.server_host, temp_udp_port))

        _, chat_receiving_address = temp_udp_server_socket.recvfrom(1024)
        self.sslsocket.send(str(chat_receiving_address))
        self.sslsocket.recv(1024)

        try:
            code = str(randint(0, 10000))
            chat_file_name = "client" + code
            with open(chat_file_name, "a") as my_file:
                my_file.write(self.name + "\n")
                my_file.write(str(chat_sending_address)[1:-1] + "\n")
                my_file.write(str(chat_receiving_address)[1:-1])
            print("If you want to use the chat use this code: " + code)
        except Exception as e:
            traceback.print_exc(file=sys.stdout)
            print(e)
            print("Unexpected error, not chat client available")

        temp_socket.close()
        temp_recv_udp_client_socket.close()
        temp_send_udp_client_socket.close()
        return True