Python → Python projekti → Python chat server


Python chat server (Socket programiranje)


Projekat 11 od 12

□ Napredni projekat: real-time komunikacija + socket programiranje

U ovom projektu kreiraćemo jednostavan chat server koristeći Python i socket modul. Cilj je da nekoliko korisnika može da šalje poruke između klijenata putem servera.

Ovaj projekat je odličan primer za učenje osnova mrežnog programiranja i socket komunikacije u Pythonu.

Chat server radi tako što prihvata dolazne konekcije od klijenata i prosleđuje poruke svim povezanim korisnicima.

Kako funkcioniše sistem?

  • Server drži listu povezanih klijenata
  • Svaki klijent radi u posebnom thread-u
  • Poruka se šalje svim klijentima (broadcast)
  • Socket omogućava real-time komunikaciju
Ovo je osnova modernih aplikacija kao što su:
  • Discord
  • WhatsApp Web
  • online igre

Gde se koristi ovakav sistem?

  • chat aplikacije (WhatsApp, Messenger)
  • online igre (multiplayer)
  • live notifikacije
  • kolaborativni alati

Potrebni alati

  • Python 3
  • Terminal / Command Prompt
  • Osnovno znanje Python funkcija i petlji

Server kod


import socket
import threading

# Kreiranje server soketa
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('127.0.0.1', 5555))
server.listen()

clients = []
nicknames = []

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

def handle(client):
    while True:
        try:
            message = client.recv(1024)
            broadcast(message)
        except:
            index = clients.index(client)
            clients.remove(client)
            client.close()
            nickname = nicknames[index]
            broadcast(f'{nickname} je napustio chat!'.encode('utf-8'))
            nicknames.remove(nickname)
            break

def receive():
    while True:
        client, address = server.accept()
        print(f"Povezan: {str(address)}")

        client.send('NICK'.encode('utf-8'))
        nickname = client.recv(1024).decode('utf-8')
        nicknames.append(nickname)
        clients.append(client)

        print(f'Nickname korisnika je {nickname}')
        broadcast(f'{nickname} se pridružio chatu!'.encode('utf-8'))
        client.send('Povezan na server!'.encode('utf-8'))

        thread = threading.Thread(target=handle, args=(client,))
        thread.start()

print("Server je pokrenut...")
receive()

Mini projekat – Klijent

Da bi chat radio, potrebni su klijenti koji se povezuju na server.


import socket
import threading

nickname = input("Izaberite nickname: ")

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 5555))

def receive():
    while True:
        try:
            message = client.recv(1024).decode('utf-8')
            if message == 'NICK':
                client.send(nickname.encode('utf-8'))
            else:
                print(message)
        except:
            print("Greška!")
            client.close()
            break

def write():
    while True:
        message = f'{nickname}: {input("")}'
        client.send(message.encode('utf-8'))

receive_thread = threading.Thread(target=receive)
receive_thread.start()

write_thread = threading.Thread(target=write)
write_thread.start()

Kako radi ovaj projekat?

  • Server prihvata konekcije od više klijenata
  • Poruke se prosleđuju svim klijentima u realnom vremenu
  • Korisnici mogu videti ko je pristupio ili napustio chat

Kako unaprediti projekat?

  • dodati login sistem
  • preći na WebSocket (FastAPI / Django Channels)
  • napraviti GUI klijent (Tkinter)
  • deploy na server (VPS / cloud)

Ograničenja ovog projekta

Ovo je edukativni primer i ima ograničenja:
  • ne koristi autentifikaciju
  • nema enkripciju poruka
  • radi samo lokalno (localhost)

Povezane lekcije i projekti


Često postavljana pitanja

Da li ovaj chat server radi preko interneta?

Ovaj primer radi lokalno na računaru. Za rad preko interneta potrebno je koristiti javnu IP adresu i port forward na ruteru.

Šta je socket u Pythonu?

Socket predstavlja tačku komunikacije između servera i klijenta.

Da li možemo dodati GUI klijenta?

Da, može se koristiti Tkinter ili PyQt za vizuelni prikaz poruka.