Building a Simple Python Chat Room with Multi-Client Socket Programming

Published on 15 Jun 2025 Tech Python
image
Photo by Rémi Walle on Unsplash
Disclaimer: This post was created with the assistance of Gemini and/or ChatGPT for informational purposes. While given a quick look over, readers are encouraged to verify key facts independently.

This guide walks you through creating a basic chat room in Python using sockets and threading. You will learn how to design the architecture, implement a multi-client server, build an interactive client, handle usernames, and test or enhance your chat room.

1. Design the Chat Room Architecture

Plan how the server will manage multiple clients, broadcast messages, and handle connections/disconnections. The server will use threads to handle each client and a shared list to keep track of connected clients.


# Pseudocode for server architecture
clients = []

def handle_client(client_socket):
    while connected:
        message = client_socket.recv()
        broadcast(message)

def broadcast(message):
    for client in clients:
        client.send(message)

2. Implement the Multi-Client Chat Server

Write a Python server that accepts multiple clients, receives messages, and broadcasts them to all connected clients using threads.


# server.py
import socket
import threading

HOST = '127.0.0.1'
PORT = 5555

def handle_client(conn, addr):
    print(f"Connected by {addr}")
    data = conn.recv(1024)
    if data:
        print(f"Received from {addr}: {data.decode()}")
        conn.sendall(b"Hello from server!")
    conn.close()

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    print("Server listening...")
    while True:
        conn, addr = s.accept()
        thread = threading.Thread(target=handle_client, args=(conn, addr))
        thread.start()

3. Develop the Interactive Chat Client

Create a Python client that connects to the server, sends user input, and displays messages from other users in real time.


# client.py
import socket
import threading

HOST = '127.0.0.1'
PORT = 5555

def receive_messages(sock):
    while True:
        try:
            message = sock.recv(1024)
            if not message:
                break
            print(message.decode())
        except:
            break

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((HOST, PORT))

threading.Thread(target=receive_messages, args=(client,), daemon=True).start()

while True:
    msg = input()
    if msg.lower() == 'exit':
        break
    client.sendall(msg.encode())

client.close()

4. Handle Usernames and Message Formatting

Add support for clients to set usernames and format messages for clarity in the chat room.


# In client.py, prompt for username
username = input("Enter your username: ")
client.sendall(username.encode())

# In server.py, receive and store username
usernames = {}

def handle_client(client_socket):
    username = client_socket.recv(1024).decode()
    usernames[client_socket] = username
    welcome = f"{username} has joined the chat."
    broadcast(welcome.encode(), client_socket)
    while True:
        try:
            message = client_socket.recv(1024)
            if not message:
                break
            formatted = f"{username}: {message.decode()}"
            broadcast(formatted.encode(), client_socket)
        except:
            break
    clients.remove(client_socket)
    client_socket.close()
    broadcast(f"{username} has left the chat.".encode(), client_socket)

5. Test and Enhance the Chat Room

Run the server and multiple clients, test message broadcasting, and discuss possible enhancements like private messaging or a simple GUI.

  • Start the server: python server.py
  • Open multiple terminals and run python client.py in each.
  • Test sending messages between clients.

View Source Code

Check out the full implementation and contribute on GitHub:

Building a Simple Python Chat Room with Multi-Client Socket Programming

Comments