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_toolkit2๏ธโฃ Jalankan Server
python server.pyServer akan listen di:
0.0.0.0:123453๏ธโฃ Jalankan Client
python client.pySebelum 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/

