378 words
2 minutes
Aplikasi Chatting via Scoket

๐Ÿงต Simple Python Chat App (Socket + Threading + Prompt Toolkit)#

Aplikasi ini adalah contoh sederhana chat server & client berbasis Socket menggunakan Python. Server dapat menerima banyak client sekaligus dengan bantuan threading, dan tampilan client lebih nyaman menggunakan prompt_toolkit sehingga input pesan tidak terganggu oleh pesan masuk.


๐Ÿ“ Struktur Project#

chat-app/
โ”‚โ”€โ”€ server.py
โ”‚โ”€โ”€ client.py
โ”‚โ”€โ”€ README.md   (file ini)

โš™๏ธ Fitur#

  • Multi-user chat dalam satu jaringan
  • Broadcast pesan ke semua client
  • Notifikasi user join/leave
  • Input client rapi berkat prompt_toolkit
  • Thread-safe dictionary untuk list client

๐Ÿ–ฅ๏ธ server.py#

import socket
import threading

HOST = "0.0.0.0"  # Listen pada semua interface LAN/WiFi
PORT = 12345

clients = {}  # {socket: name}
lock = threading.Lock()  # untuk akses thread-safe ke clients

def broadcast(msg, sender=None):
    with lock:
        for client in list(clients):
            if client != sender:
                try:
                    client.sendall(msg.encode('utf-8'))
                except (ConnectionResetError, OSError):
                    client.close()
                    del clients[client]

def handle_client(client_socket, addr):
    try:
        name = client_socket.recv(1024).decode('utf-8')
        with lock:
            clients[client_socket] = name
        broadcast(f"{name} has joined the chat!", sender=client_socket)

        while True:
            msg = client_socket.recv(1024).decode('utf-8')
            if not msg:
                break
            broadcast(f"{name}: {msg}", sender=client_socket)

    except (ConnectionResetError, OSError):
        pass
    finally:
        with lock:
            if client_socket in clients:
                name = clients[client_socket]
                del clients[client_socket]
                broadcast(f"{name} has left the chat.")
        client_socket.close()

def start():
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.bind((HOST, PORT))
    server.listen()
    print(f"Server running on {HOST}:{PORT}")

    try:
        while True:
            client_socket, addr = server.accept()
            threading.Thread(target=handle_client, args=(client_socket, addr), daemon=True).start()
    except KeyboardInterrupt:
        print("\nServer shutting down...")
        with lock:
            for client in list(clients):
                client.close()
        server.close()

if __name__ == "__main__":
    start()

๐Ÿง‘โ€๐Ÿ’ป client.py#

import socket
import threading
from prompt_toolkit import PromptSession
from prompt_toolkit.patch_stdout import patch_stdout

SERVER_IP = "127.0.0.1"  # Sesuaikan dengan IP server LAN
PORT = 12345

def receive_messages(sock):
    while True:
        try:
            msg = sock.recv(1024).decode()
            if msg:
                with patch_stdout():
                    print(msg)  # tampil di atas prompt tanpa merusak input
        except:
            print("Disconnected from server")
            sock.close()
            break

def main():
    name = input("Enter your name: ")

    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect((SERVER_IP, PORT))
    client.sendall(name.encode())
    print(f"Connected to chat server as {name}!")

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

    while True:
        msg = session.prompt("You: ")
        if msg.lower() == "<exit>":
            client.close()
            break
        client.sendall(msg.encode())

if __name__ == "__main__":
    main()

๐Ÿ“ก Cara Menjalankan#

1๏ธโƒฃ Install dependency#

Client membutuhkan prompt_toolkit:

pip install prompt_toolkit

2๏ธโƒฃ Jalankan Server#

python server.py

Server akan listen di:

0.0.0.0:12345

3๏ธโƒฃ Jalankan Client#

python client.py

Sebelum connect, ubah bagian berikut pada client.py agar sesuai IP server LAN:

SERVER_IP = "192.168.x.x"

๐Ÿ“ Catatan#

  • Jika client ingin disconnect, ketik:
<exit>
  • Semua pesan otomatis di-broadcast ke user lain.

๐Ÿ“ฆ Lisensi#

Proyek ini bebas digunakan untuk belajar atau dikembangkan lagi.
Tambahkan fitur seperti GUI, enkripsi pesan, atau user list jika diperlukan!

Aplikasi Chatting via Scoket
https://tenzly-amirzaky.vercel.app/posts/chatting-socket/
Author
Tenzly Amirzaky
Published at
2025-10-11