| STT | Họ và Tên | MSSV | Đóng góp | |
|---|---|---|---|---|
| 1 | Nguyễn Văn Tuấn | B22DCVT489 | tuannguyenvan1301@gmail.com | Trưởng nhóm. Xây dựng RMI Master Server (quản lý Worker, giao task, gom kết quả). Xây dựng Node.js API (trung gian) và giao tiếp TCP với Master. Kiểm thử toàn hệ thống. (Mới) Phát triển và hiển thị tiến trình crawl (realtime) bằng WebSocket thay vì polling - API. |
| 2 | Nguyễn Thị Trang | B22DCDT316 | trangtreng100704@gmail.com | RMI Worker (Networking). Thiết kế RMI client, quản lý kết nối tới Master. Nhận và thực thi task. Xử lý đa luồng (ThreadPool) cho Worker để crawl song song. |
| 3 | Nguyễn Minh Vũ | B22DCVT594 | vunm2004@gmail.com | RMI Worker (Data) & Web UI. Xây dựng module xử lý HTML (Jsoup), chuẩn hóa JSON. Thiết kế và lập trình giao diện Web UI (Next.js, Chart.js) để nhập URL và hiển thị kết quả. (Mới) Phân tích nội dung cơ bản, phân loại chủ đề crawl data. |
Tên nhóm: Nhóm 04 – Lập trình mạng
Chủ đề đã đăng ký: Hệ thống thu thập dữ liệu phân tán (Distributed Web Crawler) sử dụng Java RMI
Hệ thống của nhóm em xây dựng một trình thu thập dữ liệu web (web crawler) phân tán. Mục đích là để thu thập dữ liệu từ nhiều website bằng cách sử dụng nhiều client (worker) chạy song song và được điều phối bởi một server trung tâm (master) thông qua Java RMI.
Hệ thống có một giao diện web (dashboard) xây dựng bằng Next.js cho phép người dùng:
- Nhập vào một danh sách các URL cần thu thập.
- Gửi yêu cầu crawl đến hệ thống.
- Theo dõi tiến trình và xem kết quả (dữ liệu crawl được) trực quan hóa qua biểu đồ theo thời gian thực (Real-time).
Cấu trúc logic tổng quát:
graph TD;
A["<B>NEXT.JS WEB</B><br/>- Nhập danh sách URL<br/>- Hiển thị kết quả Real-time"]
B["<B>NODE.JS API SERVER</B><br/>- HTTP: Gửi lệnh Crawl<br/>- Socket.io: Đẩy dữ liệu về Web<br/>- Server-side Polling tới Java"]
C["<B>JAVA RMI MASTER</B><br/>- Điều phối crawl task<br/>- Gom kết quả từ Worker<br/>- TCP Server (nhận lệnh/trả kqua)"]
D["<B>JAVA RMI WORKER</B><br/>- Nhận URL từ Master<br/>- Crawl HTML bằng Jsoup<br/>- Gửi kết quả về Master"]
A -- "HTTP POST (Gửi lệnh)" --> B;
B -- "Socket.io (Real-time Push)" --> A;
B -- "TCP Socket" --> C;
C -- "RMI" --> D;
| Thành phần | Công nghệ | Ghi chú |
|---|---|---|
| RMI Master | Java | Điều phối, quản lý Worker, phân task qua Java RMI. |
| RMI Worker | Java, Jsoup | Nhận task RMI, crawl dữ liệu bằng Jsoup, xử lý đa luồng. |
| API Server | Node.js, Express, Socket.io | Trung gian nhận request HTTP từ Web và giao tiếp với RMI Master. |
| Web UI | Next.js (React), TailwindCSS, Socket Client | Giao diện người dùng nhập liệu và hiển thị kết quả. |
| Trực quan hóa | Chart.js | Vẽ biểu đồ thống kê kết quả crawl trên Web UI. |
| Giao tiếp | Java RMI, TCP, HTTP, WebSocket | Các giao thức mạng sử dụng trong hệ thống. |
git clone https://github.com/jnp2018/mid-project-316489594.git
cd mid-project-316489594cd source/rmi-master
javac *.java
# Khởi động RMI Registry (Lưu ý: chạy background hoặc terminal riêng)
rmiregistry &
java MasterServerMở nhiều terminal để chạy nhiều Worker.
cd source/rmi-worker
javac *.java
java WorkerClientcd source/api-nodejs
npm install
# Server chạy tại http://localhost:3001 (Hỗ trợ cả HTTP và WebSocket)
npm startcd source/ui-nextjs
npm install
# Giao diện chạy tại http://localhost:3000
npm run dev- Truy cập http://localhost:3000 trên trình duyệt.
- Kiểm tra trạng thái Socket Monitor: "Connected 🟢".
- Nhập danh sách các URL (ví dụ: https://vnexpress.net) vào ô textarea.
- Nhấn nút "Start Crawl".
- Quan sát: Không cần F5, kết quả sẽ tự động xuất hiện trên bảng và biểu đồ khi Worker xử lý xong.
Hệ thống sử dụng 4 luồng giao tiếp chính:
1. Web UI ↔ API Server (WebSocket - Socket.io)
Đây là luồng cập nhật dữ liệu chính (Real-time).
| Sự kiện (Event) | Hướng | Payload Data | Mô tả |
|---|---|---|---|
connect |
Server → Client | — | Thiết lập kết nối Real-time. |
update-data |
Server → Client | Array<CrawlResult> |
Server chủ động đẩy danh sách kết quả mới nhất xuống Client. |
2. Web UI ↔ API Server (HTTP)
Dùng để gửi lệnh điều khiển (Command).
| Endpoint | Method | Input (JSON Body) | Output (JSON) |
|---|---|---|---|
/api/crawl |
POST | {"urls": ["...", "..."], "category": "..."} |
{"message": "Tasks submitted"} |
3. API Server ↔ RMI Master (TCP Socket)
Node.js đóng vai trò Client TCP, Java là Server TCP.
| Mục đích | Protocol | Định dạng Data |
|---|---|---|
| Gửi Task | TCP | Format text: CATEGORY:...\nURL1\nURL2... |
| Lấy kết quả | TCP | Gửi lệnh: GET_RESULTS → Nhận về: JSON String |
4. RMI Master ↔ RMI Worker (Java RMI)
| Phương thức (Interface) | Mục đích |
|---|---|
registerWorker(...) |
Worker đăng ký với Master. |
submitTask(...) |
Master gửi nhiệm vụ cho Worker. |
submitResult(...) |
Worker trả kết quả về Master. |
healthCheck() |
Master kiểm tra sức khỏe Worker. |
assignment-network-project/
├── README.md
├── INSTRUCTION.md
├── statics/
│ ├── diagram.png
│ └── result.png
└── source/
├── .gitignore
├── common/ # Thư viện chung cho Java
│ ├── CrawlResult.java
│ ├── CrawlService.java
│ ├── CrawlTask.java
│ └── WorkerService.java
├── api-nodejs/ # Server trung gian (Express + Socket.io)
│ ├── package.json
│ ├── index.js # Logic HTTP & WebSocket Server
│ └── (source files...)
├── rmi-master/ # Java Master Server
│ ├── CrawlService.java
│ ├── MasterServer.java
│ ├── SocketApiBridge.java # Cầu nối TCP với Node.js
│ └── (source files...)
├── rmi-worker/ # Java Worker Client
│ ├── WorkerClient.java
│ ├── CrawlParser.java
│ └── (source files...)
└── ui-nextjs/ # Giao diện Web (NextJs)
├── package.json
├── app/
│ └── page.js # Dashboard chính (Socket Client)
├── components/
│ └── CrawlChart.js # Biểu đồ thống kê
└── (source files...)
- Cải thiện giao diện người dùng
- Thêm tính năng xác thực và phân quyền
- Tối ưu hóa hiệu suất
- Triển khai trên cloud
- Cho phép người dùng cấu hình chi tiết (chọn domain, số thread, giới hạn độ sâu crawl) trên UI.
- Lưu kết quả crawl vào cơ sở dữ liệu (PostgreSQL/MongoDB) thay vì lưu trên memory của Master.
- Hướng dẫn lập trình Java RMI (Oracle)
- Tài liệu Jsoup (jsoup.org)
- Tài liệu Next.js (nextjs.org)
- Tài liệu Chart.js (chartjs.org)
- Hướng dẫn Express.js (expressjs.com)
- Tài liệu Socket.io (socket.io/docs)

