Skip to content

tvangx/Distributed-Web-Crawler

Repository files navigation

BÀI TẬP LỚN: LẬP TRÌNH MẠNG

Distributed Web Crawler

🧑‍💻 THÔNG TIN NHÓM

STT Họ và Tên MSSV Email Đó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


🧠 MÔ TẢ HỆ THỐNG

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:

  1. Nhập vào một danh sách các URL cần thu thập.
  2. Gửi yêu cầu crawl đến hệ thống.
  3. 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;
Loading

⚙️ CÔNG NGHỆ SỬ DỤNG

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.

🚀 HƯỚNG DẪN CHẠY DỰ ÁN

1. Clone repository

git clone https://github.com/jnp2018/mid-project-316489594.git
cd mid-project-316489594

2. Chạy RMI Master (Java)

cd source/rmi-master
javac *.java
# Khởi động RMI Registry (Lưu ý: chạy background hoặc terminal riêng)
rmiregistry &
java MasterServer

3. Chạy RMI Worker (Java)

Mở nhiều terminal để chạy nhiều Worker.

cd source/rmi-worker
javac *.java
java WorkerClient

4. API Server (Node.js)

cd source/api-nodejs
npm install
# Server chạy tại http://localhost:3001 (Hỗ trợ cả HTTP và WebSocket)
npm start

5. Chạy Web UI (Next.js)

cd source/ui-nextjs
npm install
# Giao diện chạy tại http://localhost:3000
npm run dev

6. Kiểm thử nhanh

  1. Truy cập http://localhost:3000 trên trình duyệt.
  2. Kiểm tra trạng thái Socket Monitor: "Connected 🟢".
  3. Nhập danh sách các URL (ví dụ: https://vnexpress.net) vào ô textarea.
  4. Nhấn nút "Start Crawl".
  5. 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.

🔗 GIAO TIẾP (GIAO THỨC SỬ DỤNG)

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.

📊 KẾT QUẢ THỰC NGHIỆM

Demo Result Demo Result


🧩 CẤU TRÚC DỰ ÁN

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...)

🧩 HƯỚNG PHÁT TRIỂN THÊM

  • 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.

📚 TÀI LIỆU THAM KHẢO

  • 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)

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors