A TCP-based multi-client chat server built with Core Java — demonstrating Multithreading, Java Sockets, ExecutorService, ConcurrentHashMap, and the Producer-Consumer pattern using BlockingQueue.
| Feature | Implementation |
|---|---|
| 50+ concurrent clients | Fixed-size ExecutorService (thread pool) |
| Thread-safe session store | ConcurrentHashMap<clientId, ClientHandler> |
| Zero-loss messaging | BlockingQueue (Producer-Consumer pattern) |
| Broadcast messaging | Send to all connected clients |
| Private messaging | Direct message to a specific user |
| Graceful shutdown | ShutdownHook + awaitTermination |
| Custom exceptions | ChatServerException hierarchy |
| Resource management | try-with-resources on all I/O streams |
- Multithreading —
ExecutorService,Thread,Runnable - Concurrency —
ConcurrentHashMap,BlockingQueue,volatile - Java Sockets —
ServerSocket,Socket, TCP communication - Java I/O —
BufferedReader,PrintWriter,InputStreamReader - OOP — Encapsulation, Single Responsibility Principle
- Collections Framework —
ConcurrentHashMap,LinkedBlockingQueue - Design Patterns — Producer-Consumer, Thread-per-client
src/main/java/com/chatserver/
├── ChatServer.java # Entry point; manages ServerSocket + thread pool
├── ClientHandler.java # Runnable; one per connected client
├── MessageBroker.java # Consumer thread; delivers from BlockingQueue
├── Message.java # Immutable message model
├── MessageType.java # Enum: BROADCAST | PRIVATE
├── ChatServerException.java # Custom exception hierarchy
└── ChatClient.java # Terminal client for testing
Client 1 ──┐
Client 2 ──┤──► ClientHandler (Thread Pool) ──► BlockingQueue ──► MessageBroker ──► Deliver
Client N ──┘ (Producer) (Consumer)
ConcurrentHashMap
(active session store)
- Java 8 or above
- No external dependencies
javac -d out src/main/java/com/chatserver/*.javajava -cp out com.chatserver.ChatServerjava -cp out com.chatserver.ChatClientJOIN:<username> → Set your display name
MSG:<text> → Broadcast to all users
PRIVATE:<username>:<text> → Send private message
QUIT → Disconnect
[SERVER] Welcome! Your ID: a3f2b1c4. Use JOIN:<name> to set your username.
JOIN:Shambhavi
[SERVER] [User-a3f2b1c4 is now known as Shambhavi]
MSG:Hello everyone!
PRIVATE:Alice:Hey, only for you!
QUIT
Author: Shambhavi Trivedi
Tech Stack: Java 8 · TCP Sockets · ExecutorService · ConcurrentHashMap · BlockingQueue