Bối cảnh và vấn đề nghiên cứu

Trong lĩnh vực ứng dụng đồ họa trên máy tính, các phần mềm vẽ phổ biến như Windows Paint, Artweaver hay GIMP từ lâu đã cung cấp cho người dùng những công cụ đa dạng để tạo lập và chỉnh sửa hình ảnh kỹ thuật số. Tuy nhiên, các ứng dụng truyền thống này hầu hết chỉ hỗ trợ một người dùng cục bộ tại một thời điểm (đơn người dùng) và thiếu khả năng tương tác trực tuyến theo thời gian thực. Khi làm việc nhóm, việc truyền tải ý tưởng phác thảo trực quan giữa các thành viên đòi hỏi một giải pháp cho phép nhiều người cùng thao tác trên một bảng vẽ chung qua mạng máy tính.

Đề tài "Remote Draw" (Báo cáo Đồ án 1 - The First Project Report) được thực hiện bởi nhóm sinh viên Lê Đức Thịnh (MSSV: 17110076) và Nguyễn Hoàng Danh (MSSV: 17110009), lớp 17110CLA, Khoa Đào tạo Chất lượng cao, Trường Đại học Sư phạm Kỹ thuật TP. Hồ Chí Minh (HCMUTE), dưới sự hướng dẫn của TS. Nguyễn Đăng Quang vào tháng 12 năm 2019.

Mục tiêu và nhiệm vụ nghiên cứu chính của đồ án gồm:

  1. Phân tích yêu cầu và thiết kế một bảng vẽ kỹ thuật số trực tuyến cho phép nhiều người dùng kết nối, thao tác vẽ đồng thời trên một không gian làm việc chung thông qua mạng máy tính.
  2. Xây dựng các công cụ đồ họa cơ bản đáp ứng nhu cầu tạo hình: chọn đối tượng (Select), hoàn tác (Undo), đổi màu (hỗ trợ các định dạng HSB, RGB, Web), tùy chỉnh độ dày nét vẽ/đường viền, tẩy xóa (Eraser), bút vẽ tự do (Pen), vẽ hình học cơ bản (Shape: Rectangle, Ellipse) và xuất ảnh ra định dạng PNG.
  3. Hiện thực hóa kiến trúc mạng Client-Server và cơ chế đa luồng (Multi-threading) bằng ngôn ngữ Java để xử lý đồng bộ dữ liệu vẽ, quản lý phòng vẽ thông qua mã định danh (Code), và tích hợp tính năng trò chuyện trực tiếp (Chat) giữa các người dùng trong cùng bảng vẽ.

Phạm vi nghiên cứu:

  • Không gian: Đồ án triển khai và thử nghiệm hệ thống phần mềm ứng dụng mạng trong phạm vi môn học tại Trường Đại học Sư phạm Kỹ thuật TP. Hồ Chí Minh.
  • Thời gian: Dự án được thực hiện trong thời gian 10 tuần học kỳ (từ ngày 07/10/2019 đến ngày 09/12/2019).

Cơ sở lý thuyết và phương pháp

Khung lý thuyết và công nghệ sử dụng

Đề tài dựa trên các nguyên lý kỹ thuật phần mềm hướng đối tượng và lập trình ứng dụng mạng phân tán:

  • Mô hình lập trình hướng đối tượng (OOP): Mọi thành phần hiển thị trên bảng vẽ đều được mô hình hóa thành các đối tượng đồ họa (DrawingObject) sở hữu các thuộc tính xác định như tọa độ vị trí ($x, y$), màu sắc, trạng thái tô màu (fill/unfill), kích thước cọ vẽ hoặc nét viền.
  • Kiến trúc mạng Client-Server qua Java Socket: Sử dụng giao thức mạng truyền thông dạng dòng (Socket Stream) của Java để thiết lập kênh giao tiếp liên tục, hai chiều giữa máy khách và máy chủ.
  • Xử lý đa luồng (Multi-threading Programming): Áp dụng mô hình luồng độc lập để tách biệt tác vụ đọc dữ liệu (ReadThread), ghi dữ liệu (WriteThread) trên Client và xử lý từng phiên kết nối khách hàng (UserThread) trên Server, đảm bảo giao diện không bị khóa khi trao đổi dữ liệu qua mạng.
  • Công nghệ giao diện JavaFX 13: Sử dụng thư viện JavaFX Canvas và môi trường phát triển IntelliJ IDEA để xây dựng giao diện tương tác người dùng (GUI) và xử lý sự kiện chuột (Mouse Pressed, Mouse Dragged).

Phương pháp xây dựng và tổ chức thực hiện

Nhóm tác giả áp dụng quy trình kỹ thuật phần mềm tuần tự kết hợp phân công công việc cụ thể theo bảng kế hoạch 10 tuần:

Tuần Mốc thời gian Mục tiêu / Nhiệm vụ thực hiện Sinh viên phụ trách
Tuần 1 07/10/2019 Tìm hiểu và nắm bắt yêu cầu hệ thống (Understand Requirement) Danh, Thịnh
Tuần 2 14/10/2019 Đặc tả chi tiết các yêu cầu dự án (Describe requirements) Danh, Thịnh
Tuần 3-4 21/10 - 28/10/2019 Học tập và nghiên cứu ngôn ngữ lập trình Java (Learn Java language) Danh, Thịnh
Tuần 5-6 04/11 - 11/11/2019 Nghiên cứu lập trình mạng và socket (Learn network programming) Danh, Thịnh
Tuần 7-8 18/11 - 25/11/2019 Thiết kế kiến trúc phần mềm và hệ thống lớp (Building software architecture) Danh, Thịnh
Tuần 9-10 02/12 - 09/12/2019 Thiết kế giao diện người dùng, kiểm thử và hoàn thiện (GUI design & Testing) Danh, Thịnh

Thiết kế và triển khai hệ thống

Mô hình ca sử dụng (Use Case Modeling)

Hệ thống xác định tác nhân chính là Người dùng (User) tương tác với hệ thống bảng vẽ và máy chủ thông qua 7 ca sử dụng trọng tâm:

Tên Ca sử dụng Mô tả chức năng Điều kiện tiên quyết & Luồng sự kiện chính
Draw Shape Cho phép vẽ hình chữ nhật (Rectangle) hoặc hình elip (Ellipse) lên bảng vẽ. Người dùng nhấn chọn nút Shape, chọn loại hình học tương ứng và thao tác kéo thả chuột.
Pen Cho phép vẽ các nét tự do (Stroke) tùy biến lên bảng vẽ. Người dùng kích hoạt nút Pen và thao tác chuột trên canvas.
Invite Tạo bảng vẽ mới và mời người khác tham gia vẽ chung. 1. Người dùng nhấn nút Invite.
2. Kết nối giữa Client và Server được thiết lập.
3. Server khởi tạo phòng và gửi một mã định danh (Code) duy nhất.
4. Hệ thống hiển thị mã phòng lên khung chatbox.
Join Cho phép người dùng tham gia vào một bảng vẽ từ xa đang hoạt động. 1. Người dùng nhấn nút Join và cung cấp mã phòng.
2. Kết nối được thiết lập đến Server.
3. Server gửi toàn bộ dữ liệu đối tượng đồ họa hiện tại của phòng.
4. Client kết xuất (render) toàn bộ thông tin vẽ lên bảng vẽ cục bộ.
Leave Ngắt kết nối khỏi phiên làm việc chung trên máy chủ. Người dùng nhấn nút Leave; client gửi yêu cầu đóng kết nối tới server.
Export Xuất trạng thái hiện tại của bảng vẽ ra tệp hình ảnh. 1. Người dùng nhấn nút Export.
2. Hệ thống hiển thị hộp thoại chọn thư mục lưu trữ.
3. Người dùng chọn đường dẫn và ứng dụng xuất tệp PNG.
Chat Cho phép các người dùng trong cùng bảng vẽ trao đổi tin nhắn văn bản. 1. Nhập văn bản vào khung chat và nhấn Send.
2. Client gửi tin nhắn lên server.
3. Server phát quảng bá (broadcast) tin nhắn đến tất cả client trong bảng vẽ.
4. Client hiển thị tin nhắn lên cửa sổ trò chuyện.

Thiết kế kiến trúc lớp phía Client

Phần mềm Client chịu trách nhiệm thu nhận thao tác chuột, lưu trữ các đối tượng đồ họa và giao tiếp với Server qua hai luồng riêng biệt:

  • DrawingObject, Shape, Rectangle, Ellipse, Eraser, Stroke: Cấu trúc cây phân cấp lớp đối tượng đồ họa. Lớp cơ sở định nghĩa các thuộc tính vị trí, màu sắc, chế độ tô; các lớp con hiện thực logic kết xuất hình ảnh tương ứng.
  • Drawing: Đảm nhận việc khởi tạo và cập nhật trạng thái vẽ khi chuột được nhấn hoặc kéo rê:
    • initDrawEllipse(x, y, fill, color, thickness) / onDrawEllipse(x, y): Khởi tạo và cập nhật kích thước hình elip theo tọa độ chuột kéo.
    • initDrawStroke(x, y, color, penSize) / onDrawStroke(x, y): Thêm mới và kéo dài đường nét vẽ tự do.
    • initDrawEraser(x, y, eraserSize) / onDrawEraser(x, y): Xóa các nét vẽ nằm trên đường di chuyển của con trỏ tẩy.
  • Infrastructure: Quản lý thông tin trạng thái của người dùng và thông điệp truyền thông:
    • getName() / setName(name): Lấy và gán định danh người dùng.
    • getResult() / setResult(result): Xử lý giá trị phản hồi từ hệ thống.
    • getNotification(): Lấy dữ liệu thông báo trạng thái.
    • getIncomingMessage() / setIncomingMessage(msg): Quản lý luồng thông điệp nhận về từ máy chủ.
    • getOutgoingMessage() / setOutgoingMessage(msg): Quản lý luồng thông điệp chuẩn bị gửi lên máy chủ.
  • ReadThread và WriteThread: Hai luồng xử lý I/O mạng độc lập trên Client:
    • run(): Lắng nghe liên tục dữ liệu từ Socket hoặc đẩy dữ liệu từ hàng đợi ra Socket.
    • getSocket() / setSocket(): Truy xuất và cập nhật kết nối Socket hiện hành.

Thiết kế kiến trúc lớp phía Server

Phần mềm Server duy trì cơ sở dữ liệu bộ nhớ về các bảng vẽ đang hoạt động và điều phối luồng dữ liệu:

  • Artboard: Lưu trữ mã định danh phòng (Code), danh sách các đối tượng hình họa (drawingObjects) và danh sách các máy khách (clients) đang kết nối vào bảng vẽ đó.
  • Client: Lưu trữ thông tin định danh của từng kết nối khách và tham chiếu đến luồng xử lý tương ứng thông qua các phương thức getClientThread() và setClientThread().
  • Datasource: Quản lý danh mục toàn cục bao gồm getArtboards() (trả về danh sách tất cả các bảng vẽ trên Server) và getConnectedClients() (danh sách tất cả Client đang kết nối).
  • UserThread: Xử lý giao thức truyền thông cho từng kết nối máy khách độc lập:
    • run(): Lắng nghe và phân tích các gói tin yêu cầu từ Client gửi lên.
    • inviteAction(String[] message): Tiếp nhận yêu cầu mở phòng, sinh mã duy nhất, gán đối tượng đồ họa ban đầu và phản hồi mã phòng về cho Client.
    • joinAction(String[] message): Tìm kiếm phòng theo mã yêu cầu và đóng gói toàn bộ danh sách đối tượng đồ họa gửi trả cho Client mới tham gia.
    • leaveAction(Artboard artboard, Client client): Hủy đăng ký client khỏi bảng vẽ và đóng phiên kết nối an toàn.
    • updateAction(Artboard artboard, Client client): Gửi tín hiệu thông báo cho Client cập nhật lại các đối tượng đồ họa mới phát sinh.
    • broadcastMessage(Artboard artboard, Client client, String data): Phát quảng bá nội dung tin nhắn chat hoặc dữ liệu vẽ mới đến toàn bộ các Client khác trong cùng phiên bảng vẽ.

Nội dung chính theo từng chương

Báo cáo được tổ chức thành các phần và chương mục phản ánh tiến trình kỹ thuật của dự án:

  • Phần mở đầu và Lời cảm ơn (Acknowledgment & Preface): Trình bày mục tiêu học tập, hoàn cảnh thực hiện đồ án môn học kéo dài 10 tuần, sự hỗ trợ chuyên môn từ giảng viên hướng dẫn và định hướng tiếp cận các kiến thức công nghệ thông tin trong môi trường thực tế.
  • Danh mục bảng biểu và hình ảnh (Lists of Figures & Tables): Tổng hợp hệ thống 4 sơ đồ/hình ảnh kiến trúc và 27 bảng dữ liệu kỹ thuật bao gồm bảng use case, kế hoạch phân công, danh mục lớp, phương thức và kịch bản kiểm thử.
  • Mô tả mục tiêu và nghiệp vụ (Objectives & User Benefits): Nêu bật sự cần thiết của việc chuyển đổi từ công cụ vẽ đơn lẻ sang nền tảng vẽ cộng tác; liệt kê chi tiết các công cụ vẽ, bảng chọn màu, khả năng xuất ảnh định dạng PNG và tính năng mời bạn bè qua mã code.
  • Đặc tả yêu cầu và sơ đồ ca sử dụng (Use Case Specifications): Trình bày bảng chi tiết cho 7 use case cốt lõi (Draw Shape, Pen, Invite, Join, Leave, Export, Chat), quy định rõ tác nhân, tiền điều kiện và từng bước tương tác giữa người dùng - hệ thống.
  • Mô tả tiến trình và kiến trúc hệ thống (Process Description & Architecture): Phân tích chi tiết mô hình hướng đối tượng của các thực thể hình họa, kiến trúc mạng phân tán, giải thích chức năng từng phương thức trong các lớp của Client và Server.
  • Giao diện người dùng và kiểm thử (GUI & Test Cases): Bảng giải thích chi tiết giao diện đồ họa (Table 26) và danh mục các kịch bản kiểm thử chức năng (Table 27) để xác minh tính đúng đắn khi đồng bộ thao tác vẽ qua mạng.

Kết quả và đóng góp

Kết quả đạt được

  • Xây dựng hoàn chỉnh ứng dụng "Remote Draw" hỗ trợ vẽ trực tuyến theo mô hình Client-Server bằng Java và JavaFX.
  • Hiện thực thành công các tính năng xử lý đồ họa cơ bản: vẽ nét tự do (Pen), vẽ hình elip và hình chữ nhật (Shape) hỗ trợ tô đặc hoặc rỗng viền, công cụ tẩy (Eraser) tùy biến kích cỡ, hỗ trợ bảng màu (HSB, RGB, Web) và xuất dữ liệu canvas ra định dạng PNG.
  • Xây dựng cơ chế phòng làm việc cộng tác thông qua mã phòng (Artboard Code), cho phép người dùng khởi tạo phiên vẽ (Invite), tham gia phiên vẽ (Join), thoát phiên (Leave) và đồng bộ hóa danh sách đối tượng vẽ giữa nhiều máy khách.
  • Tích hợp thành công khung trò chuyện trực tiếp (Chat) cho phép các thành viên trong cùng một bảng vẽ gửi thông điệp dạng văn bản theo thời gian thực nhờ cơ chế phát quảng bá (broadcastMessage) của Server.

Đóng góp của đề tài

  • So với các ứng dụng vẽ ngoại tuyến đơn lẻ (như Windows Paint, GIMP, Artweaver), đề tài đã giải quyết được bài toán cộng tác nhóm từ xa bằng cách bổ sung lớp mạng truyền thông trên nền tảng Socket Java đa luồng.
  • Cung cấp một thiết kế hướng đối tượng chi tiết, tường minh về cách mô hình hóa các phần tử đồ họa thành các đối tượng dữ liệu có thể đóng gói, truyền tải và tái kết xuất đồng bộ qua mạng.

Hạn chế và hướng nghiên cứu tiếp

  • Về thời gian và phạm vi triển khai: Do đồ án được thực hiện trong thời lượng giới hạn 10 tuần của môn học và nhóm phải tiếp cận nhiều kiến thức mới (Java nâng cao, lập trình mạng đa luồng, JavaFX Canvas), nhóm tác giả thừa nhận thời gian phân bổ qua các tuần chưa thực sự tối ưu và hệ thống khó tránh khỏi những sai sót phát sinh trong quá trình vận hành.
  • Hạn chế kỹ thuật được phản ánh trong tài liệu: Tài liệu mới dừng lại ở việc hỗ trợ các hình cơ bản (chữ nhật, elip, nét vẽ cọ), cơ chế xử lý xung đột đồng thời khi hai người cùng chỉnh sửa một đối tượng đồ họa tại cùng thời điểm chưa được phân tích sâu.

Giá trị tham khảo

Tài liệu báo cáo đồ án "Remote Draw" mang lại giá trị tham khảo thiết thực cho:

  • Sinh viên ngành Công nghệ Thông tin, Kỹ thuật Phần mềm đang học các học phần Lập trình mạng (Network Programming), Lập trình Java hoặc Kiến trúc phần mềm.
  • Người học có nhu cầu tham khảo cách xây dựng ứng dụng đồ họa Canvas với JavaFX kết hợp kỹ thuật Socket đa luồng (Multi-threading Client-Server).
  • Cung cấp mẫu tài liệu đặc tả đồ án chuẩn mực với hệ thống bảng mô tả Use case, danh mục phân rã Class/Method và bảng phân công công việc (Work Assignment) chi tiết theo tuần.

Câu hỏi thường gặp

1. Hệ thống Remote Draw giải quyết điểm hạn chế nào của các ứng dụng vẽ như Windows Paint hay GIMP?
Các ứng dụng như Windows Paint, Artweaver, GIMP chỉ cho phép một người dùng làm việc độc lập trên máy cục bộ tại một thời điểm. Remote Draw cho phép nhiều người dùng kết nối qua mạng Internet/mạng nội bộ để cùng thao tác và vẽ đồng thời trên một bảng vẽ chung, giúp chia sẻ ý tưởng trực quan theo thời gian thực.

2. Cơ chế tạo và tham gia một phòng vẽ từ xa trong Remote Draw diễn ra như thế nào?
Khi người dùng nhấn nút Invite, máy khách kết nối đến máy chủ; máy chủ tạo một Artboard mới, sinh ra một mã định danh duy nhất (Code) và trả về hiển thị trên khung chatbox. Người dùng khác muốn tham gia chỉ cần nhấn Join, cung cấp mã này; máy chủ sẽ tìm kiếm bảng vẽ tương ứng và gửi toàn bộ dữ liệu đồ họa (drawingObjects) về máy khách để kết xuất lại.

3. Kiến trúc luồng (Thread) trên Client và Server được phân chia như thế nào?

  • Phía Client: Tách biệt thành ReadThread (chuyên lắng nghe dữ liệu cập nhật và tin nhắn gửi về từ Socket) và WriteThread (gửi dữ liệu thao tác vẽ, tin nhắn đi).
  • Phía Server: Sử dụng UserThread cho mỗi Client kết nối đến để tiếp nhận các yêu cầu nghiệp vụ (inviteAction, joinAction, leaveAction, updateAction, broadcastMessage).

4. Dữ liệu bảng vẽ được xuất ra định dạng nào và qua công cụ gì?
Ứng dụng cung cấp ca sử dụng Export, cho phép người dùng mở hộp thoại hệ thống để chọn thư mục lưu trữ và trích xuất trạng thái hiển thị hiện tại của bảng vẽ ra tệp hình ảnh định dạng PNG.

5. Nhóm tác giả phân chia trách nhiệm xây dựng các lớp chính ra sao?
Dựa trên bảng phân công trách nhiệm: Sinh viên Nguyễn Hoàng Danh phụ trách các thành phần đồ họa phía Client (lớp Drawing, xử lý vẽ các hình, nét vẽ, tẩy và sự kiện chuột). Sinh viên Lê Đức Thịnh phụ trách phần hạ tầng mạng, luồng truyền thông và toàn bộ phía Server (các lớp Infrastructure, ReadThread, WriteThread, Artboard, Client, Datasource, UserThread).

Kết luận

Đồ án "Remote Draw" của nhóm sinh viên Lê Đức Thịnh và Nguyễn Hoàng Danh tại Trường Đại học Sư phạm Kỹ thuật TP.HCM đã hoàn thành việc thiết kế và xây dựng một ứng dụng bảng vẽ cộng tác thời gian thực thông qua mạng máy tính bằng ngôn ngữ Java. Hệ thống đã hiện thực hóa thành công các công cụ vẽ cơ bản, khả năng xuất ảnh PNG, tích hợp kênh chat trực tiếp và quản lý phòng vẽ thông qua mã định danh trên nền tảng kiến trúc Client-Server đa luồng. Bản báo cáo cung cấp đầy đủ các đặc tả kỹ thuật, thiết kế hướng đối tượng và quy trình kiểm thử, đóng vai trò là một tài liệu học tập và tham khảo kỹ thuật phần mềm hoàn chỉnh.