#--------------echo_server.py-----------------------
import socket
from threading import Thread, active_count

DEFAULT_PORT = 5000

def handle_client(c_socket: socket.socket, c_address):
    print(f"[+] {c_address} joined...")
    
    while True:
        message = c_socket.recv(1024)
        
        if not message: break
        print(f"{c_address} sent:", message.decode())
        
        c_socket.sendall(message)
        
    print(f"[-] Connection closed for {c_address}")
    c_socket.close()
        

def main():
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind(('', DEFAULT_PORT))
    server_socket.listen()
    print("Server started...")
    
    while True:
        client_socket, client_address = server_socket.accept()
        
        temp = Thread(target=handle_client, args=(client_socket, client_address))
        temp.start()
        
        print("[INFO] Total connections:", active_count())
        
        
if __name__ == "__main__":
    main()

#------------------------------------------------------------
#--------------client.py-------------------------------------
import socket

DEFAULT_PORT = 5000
HOST = 'localhost'
   
def main():   
    my_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    my_socket.connect((HOST, DEFAULT_PORT))
    
    print("Connected to server. Type messages and press Enter.")
    print("Type 'exit' to quit.")
    
    while True:
        message = input("> ")
        if not message: continue
        if message == 'exit': break

        my_socket.sendall(message.encode())
        response = my_socket.recv(1024)
        print("[Server]", str(response, 'utf_8'))    
     	
    print("Closing connection...")
    my_socket.close()
    
if __name__ == "__main__":
    main()