Skip to content

codedbypu/multithreaded-chatroom-server

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

128 Commits
 
 
 
 
 
 

Repository files navigation

💬 OS Project – Multithreaded Chatroom Server

⚠️ Note: Project นี้พัฒนาเป็นส่วนหนึ่งของวิชา Operating System (OS) ร่วมกับทีม โดยได้นำมา Re-host เพื่อใช้สำหรับแสดงผลงาน

โปรเจคนี้เน้นการออกแบบสถาปัตยกรรมแบบ Multi-threading, การจัดการ Synchronization และการสื่อสารผ่าน Socket Programming ใช้งานผ่าน Command-Line Interface (CLI) เพื่อจำลองระบบแชทในระดับ OS

📌 Concept

พัฒนาระบบ Chatroom Server ที่รองรับผู้ใช้งานจำนวนมากพร้อมกัน (Concurrent Users) โดยเน้นการแก้ปัญหาที่เกิดขึ้นในระดับ OS เช่น Race Conditions, Deadlocks และการบริหารจัดการทรัพยากร (Resource Management) ให้มีประสิทธิภาพสูงสุดผ่านคิว (Queues) และ Thread Pools

ภาพรวมโปรเจค

ระบบนี้ประกอบด้วย:

  • Server – รับคำสั่งและจัดการ session ผู้ใช้
  • Client – โปรแกรมที่ผู้ใช้โต้ตอบคำสั่งแชทผ่าน terminal

โปรแกรมนี้จำลองการทำงานแบบพื้นฐานของโปรโตคอล chat ที่รองรับ:

  • การเข้าร่วมห้อง
  • ส่งข้อความ
  • ส่งข้อความส่วนตัว
  • แสดงรายชื่อสมาชิก
  • ระบบออกจากระบบ

การสื่อสารทั้งหมดทำงานผ่าน Java Socket และ threading เพื่อรองรับผู้ใช้หลายคนพร้อมกัน


⚙️ Core Architecture & Concurrency

ระบบถูกออกแบบให้ทำงานแบบ Asynchronous โดยแบ่งการทำงานของ Thread ออกเป็นส่วนๆ เพื่อไม่ให้เกิดการบล็อก (Non-blocking)

System Architecture Diagram System Architecture Diagram System Architecture Diagram System Architecture Diagram

ภาพจำลองการทำงานของสถาปัตยกรรม Message Queue และ Thread Pool ภายใน Server

  • ClientHandler: รับหน้าที่จัดการการเชื่อมต่อของ Client แต่ละคน
  • Router Pool: ตัวกลางคอยดึงงานจาก Control Queue ไปแจกจ่ายให้ Thread อื่นๆ ทำงานต่อ
  • Broadcaster Pool (Worker Threads): กลุ่ม Thread ที่รับหน้าที่กระจายข้อความ (Broadcast) ไปยังสมาชิกทุกคนในห้องแชท
  • Queue Management:
    • ControlQueue (Size: 5000) – สำหรับจัดการคำสั่งจาก Client
    • ReplyQueue (Size: 1000) – สำหรับส่งข้อความกลับไปยัง Client

✨ Key Features & OS Concepts

🔒 Advanced Synchronization

  • RoomRegistry & ClientRegistry: ใช้ ReentrantReadWriteLock เพื่อจัดการการเข้าถึงข้อมูลห้องแชท (อนุญาตให้หลาย Thread อ่านข้อมูลได้พร้อมกัน แต่บล็อกเมื่อมีการเขียน) ป้องกันปัญหา Data Inconsistency
  • Thread-Safe Data Structures: ใช้ ConcurrentHashMap และ CopyOnWriteArrayList เพื่อจัดการข้อมูล Client ที่เชื่อมต่ออยู่

💓 Heartbeat & Fault Tolerance

  • Ping Mechanism: มีระบบ HeartbeatQueue และ HeartbeatMap ที่ให้ Client ส่ง Ping มาทุกๆ 10 วินาที
  • Dead Client Removal: Server จะตรวจสอบทุก 5 วินาที หากพบว่า Client ใดไม่ส่ง Ping เกิน 30 วินาที จะตัดการเชื่อมต่อและนำออกจากระบบอัตโนมัติ (แก้ปัญหา Client ปิดโปรแกรมโดยไม่ใช้คำสั่ง Quit)

🛡️ Queue Handling & Limit

  • มีการรับมือกับกรณี Queue เต็ม (Rate Limiting):
    • หาก ReplyQueue เต็ม: ทิ้งข้อความและแจ้งเตือน "Reply queue full. Please try again later."
    • หาก ControlQueue เต็ม: แจ้งเตือน "Server busy. Your command was dropped."

📊 Performance Testing (Load Test)

เพื่อหาจุดสมดุล (Sweet Spot) ของทรัพยากร ได้มีการทดสอบยิง Request (2000 Messages/Client) เพื่อวัดประสิทธิภาพของ Server ตามจำนวน Threads:

Performance Testing Graph

Performance Testing

Threads Total Time (s) Avg Latency (ms/msg) Throughput (msg/s)
1 0.439 0.157 9,178.0
4 0.124 0.337 11,870.1
12 0.119 0.323 12,391.9
24 0.120 0.327 12,248.8

🏆 Conclusion: จากการทดสอบพบว่า 12 Threads คือจุดที่เหมาะสมที่สุด (Optimal) ให้ผลลัพธ์ Throughput สูงสุดที่ 12,391.9 msg/s และ Latency ต่ำสุด โดยการเพิ่ม Thread มากกว่า 16 ไม่ได้ช่วยให้ประสิทธิภาพดีขึ้นอย่างมีนัยสำคัญ แต่กลับกินทรัพยากร CPU เพิ่มขึ้นจาก Context Switching

(ทดสอบบน: Intel Core i3-10100, RAM 16GB)


🛠️ Tech Stack

  • Language: Java
  • Network: Java Sockets (TCP/IP)
  • Concurrency: java.util.concurrent (ThreadPool, BlockingQueue, ReentrantReadWriteLock)

🚀 How to Run

การเริ่มต้นระบบ (Startup)

  1. Run Server: สั่ง Run ไฟล์ server_os.java เพื่อเปิดใช้งานฝั่งของ Server
javac server_os.java
  1. Client Side: สั่ง Run ไฟล์ ChatClient.java เพื่อเริ่มต้นใช้งานในฝั่ง Client
javac ChatClient.java

⚠️ Note: หากไม่เปิดใช้งาน Server ก่อน จะไม่สามารถใช้โปรแกรมได้ ระบบจะทำการ Retry ทั้งหมด 5 ครั้ง ก่อนที่จะ Terminate การทำงานไป

  1. Login: เมื่อเชื่อมต่อสำเร็จ ขั้นแรกให้กรอก Name (ห้ามมีเว้นวรรค) จากนั้นกด Enter

คำสั่งที่รองรับ (Commands)

เมื่อเข้าสู่ระบบ โปรแกรมจะแสดงรายการคำสั่งและรูปแบบการใช้งานดังนี้:

คำสั่ง (Command) รูปแบบ (Format) รายละเอียด (Description)
DM DM <receiver_name> <message> ส่งข้อความส่วนตัวหาเพื่อน (Direct Message)
JOIN JOIN <#room_name> เข้าร่วมห้องแชท (ต้องมี # นำหน้าชื่อห้อง)
WHO WHO <#room_name> ดูรายชื่อคนที่อยู่ในห้องนั้นๆ
SAY SAY <#room_name> <message> ส่งข้อความหาทุกคนในห้องแชท
LEAVE LEAVE <#room_name> ออกจากห้องแชท
QUIT QUIT ออกจากโปรแกรม

กฎและเงื่อนไขการทำงาน (Rules & Behaviors)

  • Invalid Command: หากป้อนคำสั่งผิดหรือไม่มีในระบบ โปรแกรมจะแสดงข้อความแจ้งเตือน
  • SAY Command: จำเป็นต้อง JOIN ห้องที่ต้องการก่อน จึงจะสามารถส่งข้อความได้
  • Auto Leave: หากใช้คำสั่ง QUIT โปรแกรมจะนำผู้ใช้ออกจากทุกห้องโดยอัตโนมัติ
  • Timeout: หากผู้ใช้ไม่ได้ออกจากโปรแกรมอย่างถูกต้อง (ไม่ได้ใช้ QUIT) เมื่อครบเวลาที่กำหนด ระบบจะทำการนำผู้ใช้ออกจากระบบให้อัตโนมัติ

📘 เอกสารประกอบโครงการ (Technical Documentation)

เอกสารฉบับเต็มที่อธิบายรายละเอียดของระบบ ได้แก่:

  • System Architecture
  • Concurrency Design
  • Synchronization Strategy
  • Performance Testing & Analysis
  • Design Decisions

🔗 ดูสไลด์ฉบับเต็มได้ที่: OS Project – Technical Presentation


🌱 Reflection

โปรเจคนี้เป็นหนึ่งในผลงานชิ้นแรกๆของผม ที่ได้มีการใช้งาน Github ทำงานร่วมกับเพื่อนในทีม การเขียน Commit message และการจัดการโค้ดในโปรเจคอาจจะยังไม่เป็นมาตรฐาน แต่ถือเป็นจุดเริ่มต้นที่ทำให้ผมพัฒนาการใช้ Git และการจัดการ Version Control อย่างจริงจังมากขึ้น

About

ระบบเซิร์ฟเวอร์แชทแบบหลายเธรด (Multi-threaded) พัฒนาด้วย Java และ Socket Programming เน้นการจัดการ Concurrency, Synchronization และการทดสอบประสิทธิภาพของ Thread Pool

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors