import socket

import threading


def handle_client(client_socket, client_address):

    print(f"Conexão aceita de {client_address[0]}:{client_address[1]}")

   

    while True:

        try:

            # Recebe a mensagem do cliente

            data = client_socket.recv(1024).decode('utf-8')

            if not data:

                break

            print(f"Cliente {client_address[0]}:{client_address[1]} diz: {data}")

           

            # Envia a mensagem para todos os outros clientes conectados

            for client in clients:

                if client != client_socket:

                    client.send(data.encode('utf-8'))

        except:

            break


    # Remove o cliente da lista de clientes conectados

    clients.remove(client_socket)

    client_socket.close()

    print(f"Conexão encerrada com {client_address[0]}:{client_address[1]}")


# Configurações do servidor

HOST = '192.168.1.9'

PORT = 12345


# Cria um socket TCP/IP

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)


# Define a opção para reutilizar o endereço do socket

server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)


# Vincula o socket ao endereço e porta

server_socket.bind((HOST, PORT))


# Inicia o modo de escuta

server_socket.listen(5)

print(f"Servidor escutando em {HOST}:{PORT}")


# Lista para armazenar todos os clientes conectados

clients = []


while True:

    # Aceita uma nova conexão

    client_socket, client_address = server_socket.accept()

   

    # Adiciona o cliente à lista de clientes conectados

    clients.append(client_socket)

   

    # Inicia uma nova thread para lidar com o cliente

    client_thread = threading.Thread(target=handle_client, args=(client_socket, client_address))

    client_thread.start()