Building a Chat App from Scratch with Python

Creating a chat application is an exciting project that allows you to learn about networking, server-client architecture, and user interface design. In this guide, we'll walk you through the process of building a simple chat application using Python.

Table of Contents

Prerequisites

To follow this guide, you need basic Python knowledge and familiarity with the following libraries:

  • socket: Enables low-level networking in Python.
  • threading: Allows multiple threads of execution for concurrent programming.
  • tkinter: A standard Python library for creating lightweight and simple GUI applications.

Setting Up the Environment

Before we begin, ensure you have Python installed on your system. You can download Python from the official website.

After installing Python, create a new folder to store your project files. You will need two separate files for the server and client.

Understanding Socket Programming

Socket programming is a method of communication between two computers using a network protocol, usually TCP/IP. In our chat application, we'll use sockets to establish a connection between the server and clients.

Creating the Server

In your project folder, create a file named server.py. Here, we'll implement the server-side logic of our chat application.

  1. Import the necessary libraries:
import socket
import threading
  1. Define the server's IP address, port number, and create a socket object:
SERVER = '127.0.0.1'
PORT = 5050
ADDR = (SERVER, PORT)
BUFFER_SIZE = 1024
FORMAT = 'utf-8'

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(ADDR)
  1. Define the handle_client function to manage each client's connection:
def handle_client(conn, addr):
    print(f"[NEW CONNECTION] {addr} connected.")
    connected = True

    while connected:
        msg = conn.recv(BUFFER_SIZE).decode(FORMAT)
        if msg == "!DISCONNECT":
            connected = False
        print(f"[{addr}] {msg}")
        conn.send("Message received!".encode(FORMAT))

    conn.close()
  1. Create a start function to listen and accept connections:
def start():
    server.listen()
    print(f"[LISTENING] Server is listening on {SERVER}")
    
    while True:
        conn, addr = server.accept()
        thread = threading.Thread(target=handle_client, args=(conn, addr))
        thread.start()
        print(f"[ACTIVE CONNECTIONS] {threading.activeCount() - 1}")
  1. Start the server:
print("[STARTING] Server is starting...")
start()

Creating the Client

Create another file named client.py in your project folder. This file will implement the client-side logic.

  1. Import the necessary libraries:
import socket
  1. Define the server's IP address, port number, and create a socket object:
SERVER = '127.0.0.1'
PORT = 5050
ADDR = (SERVER, PORT)
BUFFER_SIZE = 1024
FORMAT = 'utf-8'

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(ADDR)
  1. Implement a function to send messages to the server:
def send(msg):
    message = msg.encode(FORMAT)
    client.send(message)
    print(client.recv(BUFFER_SIZE).decode(FORMAT))

Designing the User Interface

We will use the tkinter library to create a simple user interface for our chat application. Add the following code to client.py.

  1. Import the necessary libraries:
from tkinter import *
  1. Create a function to handle the send button click:
def send_button_click():
    msg = msg_entry.get()
    msg_entry.delete(0, END)
    send(msg)
  1. Design the UI:
root = Tk()
root.title("Chat App")

frame = Frame(root)
scrollbar = Scrollbar(frame)
msg_list = Listbox(frame, height=15, width=50, yscrollcommand=scrollbar.set)
scrollbar.pack(side=RIGHT, fill=Y)
msg_list.pack(side=LEFT, fill=BOTH)
msg_list.pack()
frame.pack()

msg_entry = Entry(root, width=30)
msg_entry.pack(side=LEFT)

send_button = Button(root, text="Send", command=send_button_click)
send_button.pack(side=RIGHT)

root.mainloop()

Running the Application

  1. First, start the server by running server.py.
  2. Then, run client.py to launch the chat application. You can run multiple instances of the client to simulate multiple users.

Conclusion

You've now built a simple chat application using Python! This project is a great introduction to socket programming, server-client architecture, and user interface design. You can extend this application by adding features such as user authentication, group chats, and file sharing.

An AI coworker, not just a copilot

View VelocityAI