Tải bản đầy đủ (.docx) (25 trang)

BÁO CÁO ĐỒ ÁN CƠ SỞ NGÀNH MẠNG ĐỀ TÀI Phần lập trình mạng Xây dựng game đánh bài cho phép nhiều người chơi qua mạng

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (554.29 KB, 25 trang )

ĐẠI HỌC ĐÀ NẴNG
TRƯỜNG ĐẠI HỌC BÁCH KHOA
KHOA CÔNG NGHỆ THÔNG TIN
----------------------------------------------

BÁO CÁO ĐỒ ÁN

CƠ SỞ NGÀNH MẠNG
ĐỀ TÀI
Phần lập trình mạng
Xây dựng game đánh bài cho phép nhiều người chơi qua mạng.
Phần nguyên lý hệ điều hành
Ứng dụng cơ chế multithread để giải hệ phương trình.


LỜI MỞ ĐẦU................................................................................................................... 2
PHẦN I. LẬP TRÌNH MẠNG........................................................................................3
Đề tài: Xây dựng game đánh bài sử dụng socket.io trong Nodejs......................................3
CHƯƠNG 1. CƠ SỞ LÝ THUYẾT VÀ TỔNG QUAN VỀ ĐỀ TÀI........................3
1. Cơ sở lý thuyết......................................................................................................3
2. Tổng quan về đề tài...............................................................................................9
CHƯƠNG 2: PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG.......................................12
1. Phân tích chức năng...........................................................................................12
2. Triển khai............................................................................................................12
3. Đánh giá kết quả..................................................................................................14
CHƯƠNG 3: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN..........................................15
1. Kết luận................................................................................................................15
2. Hướng phát triển.................................................................................................15
PHẦN II. NGUYÊN LÝ HỆ ĐIỀU HÀNH..................................................................16
Đề tài: Ứng dụng cơ chế multithread để giải bài tốn hệ phương trình............................16
CHƯƠNG 1. CƠ SỞ LÝ THUYẾT VÀ TỔNG QUAN VỀ ĐỀ TÀI......................16


1. Cơ sở lý thuyết....................................................................................................16
2. Tổng quan về đề tài.............................................................................................20
CHƯƠNG 2: PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG.......................................21
1. Phân tích bài tốn và xây dựng thuật toán.......................................................21
2. Triển khai............................................................................................................23
3. Đánh giá kết quả..................................................................................................23
CHƯƠNG 3: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN..........................................24
1. Kết luận................................................................................................................24
2. Hướng phát triển.................................................................................................24

1


LỜI MỞ ĐẦU
Nguyên lý hệ điều hành và Lập trình mạng là những kiến thức căn bản và là
nền tảng mà mỗi lập trình viên phải hiểu rõ để phục vụ cho những kiến thức cao hơn.
Về phần lập trình mạng, ngày nay khi nói đến phát triển các ứng dụng phần mềm,
đa số là người ta muốn nói đến chương trình có khả năng làm việc trong mơi trường
mạng tích hợp nói chung và mạng máy tính nói riêng. Từ các chương trình kế tốn doanh
nghiệp, quản lý, trị chơi, điều khiển... đều là các chương trình ứng dụng mạng. Vì vậy,
khơng thể phủ nhận rằng mạng có vai trò cực kỳ quan trọng đối với mỗi người và càng
quan trọng hơn trong thời đại công nghệ càng ngày càng phát triển.
Hệ điều hành cũng quan trọng không kém, nếu mạng dùng để phát triển các ứng
dụng phần mềm được kết nối tới máy tính thì hệ điều hành được xem là thành phần trung
gian hay là cầu nối cho sự giao tiếp của người sử dụng và máy tính. Thơng qua hệ điều
hành, người sử dụng dễ dàng làm việc và khai thác hiệu quả thiết bị phần cứng máy tính,
quản lý phần mềm ứng dụng. Người sử dụng chỉ cần thao tác các lệnh, các sự kiện và chờ
các tiến trình của hệ điều hành thực hiện.
Dựa trên những hiểu biết của mình và tìm hiểu tài liệu, em đã nghiên cứu và thực
hiện hai đề tài: xây dựng game đánh bài cho phép nhiều người chơi qua mạng (phần lập

trình mạng) và ứng dụng cơ chế MultiThread để giải bài tốn hệ phương trình.
Em xin chân thành cảm ơn thầy cô khoa Công Nghệ Thông Tin đã tạo điều kiện để
em nghiên cứu những kiến thức này, đặc biệt là thầy Nguyễn Tấn Khôi đã nhiệt tình theo
dõi, hướng dẫn em trong quá trình thực hiện đề tài này.
Vì kiến thức và khả năng tìm hiểu cịn hạn chế nên khơng thể tránh khỏi sai sót
trong quá trình thực hiện các đề tài, em rất mong nhận được sự góp ý của các thầy cơ để
có được kết quả hoàn thiện hơn.

2


PHẦN I. LẬP TRÌNH MẠNG
Đề tài: Xây dựng game đánh bài sử dụng socket.io trong Nodejs

CHƯƠNG 1. CƠ SỞ LÝ THUYẾT VÀ TỔNG QUAN VỀ ĐỀ TÀI
1. Cơ sở lý thuyết
1.1: Khái niệm lập trình mạng.
Ngày nay khi nói đến phát triển các ứng dụng phần mềm, đa số là người ta
muốn nói đến chương trình có khả năng làm việc trong mơi trường mạng tích hợp
nói chung và mạng máy tính nói riêng. Từ các chương trình kế tốn doanh nghiệp,
quản lý, trò chơi, điều khiển... đều là các chương trình ứng dụng mạng.
Vấn đề lập trình mạng liên quan đến nhiều lĩnh vực kiến thức khác nhau. Từ
kiến thức sử dụng ngơn ngữ lập trình, phân tích thiết kế hệ thống, kiến thức hệ
thống mạng, mơ hình xây dựng chương trình ứng dụng mạng, kiến thức về cơ sở dữ
liệu... cho đến kiến thức truyền thông, các kiến thức các lĩnh vực liên quan khác như
mạng điện thoại di động, PSTN, hệ thống GPS, các mạng như BlueTooth, WUSB,
mạng sensor.... Nhưng có thể nói vấn đề lập trình mạng có 3 vấn đề chính cốt lõi
tích hợp trong lập trình ứng dụng mạng và được thể hiện như hình dưới

3



Hay nói cách khác, vấn đề lập trình mạng có thể được định nghĩa với công thức
sau:
LTM = KTM + MH + NN





LTM: Lập trình mạng
KTM: Kiến thức mạng truyền thơng (mạng máy tính, PSTN,...)
MH: Mơ hình lập trình mạng
NN: Ngơn ngữ lập trình mạng

1.2: Mạng máy tính là gì.
Mạng máy tính là một hệ thống gồm nhiều máy tính và các thiết bị được kết
nối với nhau bởi đường truyền vật lý theo một kiến trúc (Network Architecture) nào
đó nhằm thu thập, trao đổi dữ liệu và chia sẻ tài ngun cho nhiều người sử dụng.
Mơ hình ứng dụng mạng:
● Mơ hình mạng ngang hàng (Peer to Peer): cho phép mọi nút mạng vừa
đóng vai trị là thực thể yêu cầu các dịch vụ mạng (Client), vừa là các
thực thể cung cấp các dịch vụ mạng (Server). Trong môi trường này,
người dùng trên từng máy tính chịu trách nhiệm điều hành và chia sẻ tài
ngun của máy tính mình. Mơ hình này chỉ phù hợp với các tổ chức nhỏ
và không quan tâm đến vấn đề bảo mật. Phần mềm mạng peer–to–peer
được thiết kế sao cho các thực thể ngang hàng thực hiện cùng các chức
năng tương tự nhau.
● Mơ hình mạng khách chủ (Client-Server): trong mơ hình mạng máy chủ
có một hệ thống máy tính cung cấp các tài nguyên và dịch vụ cho cả hệ

thống mạng gọi là các máy chủ (Server). Một hệ thống máy tính sử dụng
tài nguyên và dịch vụ này được gọi là máy khác (Client).
1.3: Mơ hình lập trình mạng Client-Server
Mơ hình Client-Server là gì?
● Mơ hình Client-Server là mơ mình mà trong đó một số máy đóng vai trị
cung ứng dịch vụ theo yêu cầu của các máy trạm.
● Hiểu đơn giản, mơ hình Client-Server là mơ hình mạng máy tính gồm hai
thành phần chính là máy chủ (Server) và máy khách (Client)

4


Ngun lý hoạt động của mơ hình Client-Server
● Việc giao tiếp giữa Client và Server phải dựa trên các giao thức chuẩn
Một số giao thức được sử dụng phổ biến hiện nay như: TCP/IP, UDP,
OSI…
● Mơ hình này gồm hai thành phần chính: Client và Server
 Client: là nơi gửi các yêu cầu xử lý về máy chủ và tổ chức giao tiếp
với người dùng, với mơi trường bên ngồi cũng như với Server. Sau
khi tiếp nhận yêu cầu người dùng, phần phía Client gửi về phía
Server.
 Server:máy chủ xử lý và gửi kết quả về cho Client. Phần phía Server
quản lý giao tiếp với mơi trường bên ngồi tại Server và với các
Client. Sau khi phân tích yêu cầu Client gửi đến, phía Server sẽ xử
lý và gửi trả kết quả về phía Client.
Ưu điểm của mơ hình Client-Server:
● Với mơ hình Client-Server, bạn có thể điều khiển cả tập trung lẫn không
tập trung các tài nguyên và bảo mật dữ liệu có thể được điều khiển qua
một số máy chuyên dụng. Phân quyền truy cập tài nguyên, directory
server, domain controller.

● Client-Server chống quá tải mạng.
● Bạn có thể được đảm bảo toàn vẹn dữ liệu trong trường hợp có sự cố xảy
ra do tập trung quản lý ở Server.
● Tiết kiệm chi phí phát triển các hệ thống ứng dụng phần mềm triển khai
trên mạng.
● Có thể mở rộng (thay đổi) phạm vi mạng dễ dàng.
● Cung cấp một nền tảng lý tưởng cho phép tích hợp các kỹ thuật hiện đại
như mơ hình thiết kế hướng đối tượng, hệ chuyên gia, hệ thông tin địa lý
(GIS)...

5


● Người dùng có thể truy cập dữ liệu từ xa để thao tác như gửi và nhận
file, tìm kiếm thơng tin.
Hạn chế của mơ hình Client-Server:
● Địi hỏi q trình bảo trì, bảo dưỡng Server.
● Do nguyên lý làm việc phải trao đổi dữ liệu giữa hai máy ở hai khu vực
địa lý khác nhau, mơ hình Client-Server dễ dàng xảy ra hiện tượng thông
tin truyền trên mạng bị lộ. Tính an tồn và bảo mật thơng tin trên mạng
là hạn chế mà mơ hình Client-Server cần khắc phục.
1.4: Ngơn ngữ lập trình mạng.
Nói chung tất cả các ngơn ngữ lập trình đều có thể sử dụng để lập trình mạng.
Nhưng mỗi ngơn ngữ có những ưu, nhược điểm khác nhau và được hỗ trợ thư viện
API ở các mức độ khác nhau. Tuỳ từng ứng dụng mạng cụ thể, hệ điều hành mạng
cụ thể và thói quen lập trình mà người lập trình có thể chọn ngơn ngữ phù hợp để
phát triển các ứng dụng mạng. Các ngôn ngữ lập trình phổ biến hiện nay gồm
những ngơn ngữ sau:







Hợp ngữ (Assembly Language)
C/C++
ASP, .NET
Java
Javascript

Đối với phát triển ứng dụng mạng hiện nay có 2 ngơn ngữ lập trình được sử
dụng phổ biến nhất, đó là .NET và Java. Người lập trình có thể sử dụng thành thạo
một trong 2 dịng ngơn ngữ đó để phát triển ứng dụng mạng. Tuy nhiên ngày nay
với sự xuất hiện của Javascript đã tạo ra một xu hướng lập trình Full-Stack thay thế
cho các cơng nghệ lập trình front-end hay back-end truyền thống.
1.5: Giao thức TCP/IP
Giao thức TCP (Transmission Control Protocol - Giao thức điều khiển truyền
nhận) là giao thức hướng kết nối (connection-oriented), nó địi hỏi thiết lập kết nối
trước khi bắt đầu gửi dữ liệu và kết thúc kết nối khi việc gửi dữ liệu hoàn tất theo
đúng thứ tự: thiết lập kết nối, truyền dữ liệu và kết thúc kết nối.
IP (Internet Protocol - Giao thức liên mạng) là địa chỉ của một máy tính trên
mạng, dựa vào địa chỉ IP giao thức TCP có thể truyền dữ liệu chính xác từ một máy
này qua máy kia thông qua hệ thống mạng. Ở trên mạng, một máy tính sẽ có một
địa chỉ IP khác nhau, từ địa chỉ IP có thể biết được máy nào trên mạng và ngược lại.

6


TCP/ IP là một bộ giao thức trao đổi thông tin được sử dụng để truyền tải và
kết nối các thiết bị trong mạng Internet. TCP/IP được phát triển để mạng được tin

cậy hơn cùng với khả năng phục hồi tự động.
Cách thức hoạt động của mơ hình TCP/IP: Phân tích từ tên gọi, TCP/IP là sự
kết hợp giữa 2 giao thức. Trong đó IP (Giao thức liên mạng) cho phép các gói tin
được gửi đến đích đã định sẵn, bằng cách thêm các thông tin dẫn đường vào các gói
tin để các gói tin được đến đúng đích đã định sẵn ban đầu. Và giao thức TCP (Giao
thức truyền vận) đóng vai trị kiểm tra và đảm bảo sự an tồn cho mỗi gói tin khi đi
qua mỗi trạm. Trong quá trình này, nếu giao thức TCP nhận thấy gói tin bị lỗi, một
tín hiệu sẽ được truyền đi và yêu cầu hệ thống gửi lại một gói tin khác.
1.6: Socket, giao thức Websocket
1.6.1: Tổng quan về socket.
Socket là một điểm cuối (endpoint) của liên kết truyền thông hai chiều
(two-way communication) giữa hai chương trình chạy trên mạng. Các lớp
Socket được sử dụng để biểu diễn kết nối giữa client và server, được ràng
buộc với một cổng port (thể hiện là một con số cụ thể) để các tầng TCP (TCP
Layer) có thể định danh ứng dụng mà dữ liệu sẽ được gửi tới.
Lập trình socket là lập trình cho phép người dùng kết nối các máy tính
truyền tải và nhận dữ liệu từ máy tính thơng qua mạng
Hiểu đơn giản, socket là thiết bị truyền thông hai chiều gửi và nhận dữ liệu
từ máy khác
Socket hoạt động như thế nào ?
● Là một giao diện lập trình ứng dụng mạng, socket giúp các bạn lập trình
kết nối các ứng dụng để truyền và nhận giữ liệu trong môi trường có kết
nối Internet bằng cách sử dụng phương thức TCP/IP và UDP.
● Khi cần trao đổi dữ liệu cho nhau thì 2 ứng dụng cần phải biết thơng tin
tối thiểu là IP và số hiệu cổng của ứng dụng kia.
 2 ứng dụng có thể nằm cùng trên một máy.
 2 ứng dụng cùng nằm trên một máy không được cùng số hiệu cổng.
1.6.2: Giao thức Websocket .
Websocket là một giao thức giúp truyền dữ liệu hai chiều giữa client-server
thông qua một kết nối TCP socket duy nhất để tạo kết nối hiệu quả và ít tốn

kém.Hơn nữa, webSocket là một giao thức được thiết kế để truyền dữ liệu
bằng cách sử dụng cổng 80 và cổng 443 và nó là một phần của HTML5. Vì
vậy, webSockets có thể hoạt động trên các cổng web tiêu chuẩn, nên không có
rắc rối về việc mở cổng cho các ứng dụng, lo lắng về việc bị chặn bởi các
tường lửa hay proxy server.

7


Không giống với giao thức HTTP là cần client chủ động gửi yêu cầu cho
server, client sẽ chờ đợi để nhận được dữ liệu từ máy chủ. Hay nói cách khác
với giao thức Websocket thì server có thể chủ động gửi thơng tin đến client
mà khơng cần phải có u cầu từ client.
Tất cả dữ liệu giao tiếp giữa client-server sẽ được gửi trực tiếp qua một kết
nối cố định làm cho thơng tin được gửi đi nhanh chóng và liên tục khi cần
thiết. WebSocket làm giảm độ trễ bởi vì một khi kết nối WebSocket được
thành lập, server khơng cần phải chờ đợi cho một yêu cầu từ client.
Tương tự như vậy, client có thể gửi tin nhắn đến server bất cứ lúc nào. Yêu
cầu duy nhất này giúp làm giảm đáng kể độ trễ, mà sẽ gửi một u cầu trong
khoảng thời gian, cho dù thơng điệp có sẵn.
Để có thể sử dụng được Websocket thì khơng phải chỉ cần trình duyệt hỗ
trợ mà cịn phải có server Websocket, server Websocket có thể được tạo ra
bằng bất kỳ ngôn ngữ server-side nào, nhưng Node.js được sử dụng rộng rãi
hơn cả vì nó viết bằng Javascript nên mang nhiều ưu điểm so với các ngôn
ngữ server-side truyền thống khác.
Hoạt động của giao thức Websocket:

Giao thức có hai phần: Bắt tay và truyền dữ liệu Ban đầu client sẽ gửi yêu
cầu khởi tạo kết nối Websocket đến server, server kiểm tra và gửi trả kết quả


8


chấp nhận kết nối, sau đó kết nối được tạo và q trình gửi dữ liệu có thể được
thực hiện, dữ liệu chính là các Ws frame.
Ưu điểm của Websocket:
● WebSockets cung cấp khả năng giao tiếp hai chiều mạnh mẽ, có độ trễ
thấp và dễ xử lý lỗi.
● API cũng rất dễ sử dụng trực tiếp mà không cần bất kỳ các tầng bổ sung
nào, so với Comet, thường đòi hỏi một thư viện tốt để xử lý kết nối lại,
thời gian chờ timeout, các Ajax request (yêu cầu Ajax), các tin báo nhận
và các dạng truyền tải tùy chọn khác nhau (Ajax long-polling và jsonp
polling).
● Không cần phải có nhiều kết nối như phương pháp Comet long-polling.
Nhược điểm của Websocket:
● Là một đặc tả mới của HTML5, WebSocket vẫn chưa được tất cả các
trình duyệt hỗ trợ.
● Do WebSocket là một TCP socket chứ không phải là HTTP request, nên
khơng dễ sử dụng các dịch vụ có phạm vi yêu cầu, như Session In View
Filter của Hibernate.

2. Tổng quan về đề tài
2.1: Tìm hiểu về game đánh bài
Đề tài em nghiên cứu không phải game đánh bài tiến lên phổ biến hiện nay, vì
nó đã có q nhiều ứng dụng trong thực tế. Còn ứng dụng của em đơn giản hơn, nó
là "bản nâng cấp" của trị chơi "kéo-búa-bao" mà ai cũng đã từng chơi hơn một lần.
Tuy nhiên, game đánh bài này có sự khác biệt, đó là "kéo-búa-bao" sẽ được
thay thế bằng các năng lượng "lửa-nước-băng", tức là lửa sẽ khắc chế băng tan,
nước sẽ khắc chế lửa và băng sẽ khắc chế nước. Và mỗi quân bài sẽ có một năng
lượng (hoặc lửa, hoặc nước, hoặc băng) cùng với một số ngẫu nhiên từ 1 đến 9.

Ngồi ra mỗi lá bài sẽ có một màu trong các màu vàng, cam, xanh lá cây, xanh
dương, đỏ, tím.
Hai người sẽ đánh lần lượt các lá bài ra, lá nào có năng lượng khắc chế được
năng lượng kia thì người đó thắng. Nếu 2 lá bài đưa ra cùng năng lượng thì sẽ so
sánh số trên 2 lá bài, lá nào có số lớn hơn thì người đó thắng. Nếu 2 lá có cùng năng
lượng và cùng số thì 2 người coi như hịa. Người thắng nhờ lá bài nào thì sẽ giữ lá
bài đó để góp phần tiến tới chiến thắng chung cuộc, người thua thì bỏ lá bài đã thua.
Để có được chiến thắng chung cuộc, mỗi người cần phải có những lá bài đã
chiến thắng từ các ván đơn trước đó, những lá bài đó phải thỏa mãn tiêu chí: hoặc là
9


có số đủ bài của cả 3 năng lượng, hoặc là có đủ số bài chứa đủ 3 màu của một năng
lượng bất kỳ (lửa, băng hoặc nước).

2.2: Xây dựng ứng dụng bằng Node.js và socket.io
2.2.1: Tổng quan về Node.js
Node.js là một mã nguồn được xây dựng dựa trên nền tảng Javascript V8
Engine, nó được sử dụng để xây dựng các ứng dụng web như các trang video
clip, các forum và đặc biệt là trang mạng xã hội phạm vi hẹp. Node.js là một
mã nguồn mở được sử dụng rộng bởi hàng ngàn lập trình viên trên tồn thế
giới. Node.js có thể chạy trên nhiều nền tảng hệ điều hành khác nhau từ
WIndow cho tới Linux, OS X nên đó cũng là một lợi thế. Node.js cung cấp
các thư viện phong phú ở dạng Javascript Module khác nhau giúp đơn giản
hóa việc lập trình và giảm thời gian ở mức thấp nhất.
Những đặc điểm nổi bật của Node.js:
● Không đồng bộ: Tất cả các API của Nodejs đều không đồng bộ (noneblocking), nó chủ yếu dựa trên nền của Nodejs Server và chờ đợi Server
trả dữ liệu về. Việc di chuyển máy chủ đến các API tiếp theo sau khi gọi
và cơ chế thông báo các sự kiện của Node.js giúp máy chủ để có được
một phản ứng từ các cuộc gọi API trước (real-time).

● Chạy rất nhanh: Nodejs được xây dựng dựa vào nền tảng V8 Javascript
Engine nên việc thực thi chương trình rất nhanh.
● Đơn luồng: Nodejs sử dụng một mơ hình luồng duy nhất (SingleThread). Điều này giúp hệ thống tốn ít RAM nhất và chạy nhanh nhất khi
không phải tạo thread mới cho mỗi truy vấn như Java hay PHP. Ngoài ra,
tận dụng ưu điểm non-blocking I/O của Javascript mà Node.js tận dụng
tối đa tài nguyên của server mà không tạo ra độ trễ như PHP
● Đặc biệt Node.js rất hiệu quả khi xây dựng những ứng dụng thời gian
thực (real-time applications) như ứng dụng chat, các dịch vụ mạng xã hội
như Facebook, Twitter,… cũng như những game có tính tương tác giữa
người với người cao như caro, đánh bài,...
2.2.2: Thư viện Socket.io trong Node.js
Nodejs là được xây dựng thuần túy bằng javascript. Đây là một điểm lợi thế
của Nodejs để lập trình web-socket:
● Thứ nhất: javascript là ngơn ngữ lập trình hướng sự kiện, mà trong lập
trình thời gian thực, cách tiếp cận bằng lập trình sự kiện là cách tiếp cận
khơn ngoan nhất.

10


● Thứ hai: Nodejs chạy non-blocking nên việc hệ thống không phải tạm
ngừng để xử lý xong một request sẽ giúp cho server trả lời client gần như
ngay tức thì.
● Thứ ba: Lập trình socket yêu cầu bạn phải xây dựng được mơ hình lắng
nghe - trả lời từ cả 2 bên. Nói cách khác đi, vai trị của client và server
phải tương đương nhau, mà client thì chạy bằng javascript, nên nếu
server cũng chạy bằng javascript nữa thì việc lập trình sẽ dễ dàng và thân
thiện hơn.
Chính vì những đặc điểm này, socket.io ra đời.
Socket.io là một bộ thư viện dành cho ứng dụng web, mobile để phát triển

các ứng dụng realtime. Với đặc trưng mạnh mẽ và dễ sử dụng, socket.io đang
ngày càng được sử dụng rộng rãi từ những trang mạng xã hội cần sự tương tác
cao, đến các blog hay các trang web thương mại điện tử. Với bộ thư viện này,
làm việc với Websocket trở nên đơn giản hơn rất nhiều. Thư viện gồm 2 phần
● Phía Client: gồm bộ thư viện viết cho web (javascript), ios, android.
● Phía Server: viết bằng javascript và dùng cho các máy chủ node.js
Socket.io hỗ trợ sử dụng rất nhiều các cơng nghệ realtime:







Websocket
Flash Socket
AJAX long-polling
AJAX multipart streaming
IFrame
JSONP polling

Nó sẽ tự động chuyển sang Websocket nếu có thể, hầu hết các trình duyệt
hiện nay đã hỗ trợ Websocket nên việc sử dụng Socket.io trên trình duyệt
cũng là đang sử dụng Websocket. Việc sử dụng Socket.io rất đơn giản và
giống nhau ở cả client lẫn server, nó bao gồm 3 phần chính
● Khởi tạo kết nối
● Lắng nghe event
● Gửi event
Riêng ở server thì sẽ khơng có phần khởi tạo kết nối vì chỉ có client mới
cần khởi tạo kết nối đến server.

Chính vì những ưu điểm và sự phổ biến của socket.io khi lập trình mạng,
em sẽ sử dụng thư viện này để lập trình cho đề tài của em, kết hợp với nền
11


tảng nodejs và framework express.js (là một framework của javascript), cơng
cụ làm việc là sublime text.

CHƯƠNG 2: PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG
1. Phân tích và triển khai chức năng
Phân tích các chức năng của hệ thống:
 Cho phép các client kết nối với server để tham gia vào game
 Cho phép nhiều máy chơi game với nhau và sẽ chia thành các cặp chơi, mỗi cặp
gồm 2 máy.
 Vì mỗi cặp chơi chỉ cho phép 2 máy chơi, nên nếu số lượng truy cập lẻ thì người
cuối cùng sẽ phải đợi người chơi khác truy cập mới chơi được (waiting).
 Tổng hợp bài của người thắng theo các tiêu chí: hoặc là có số đủ bài của cả 3 năng
lượng, hoặc là có đủ số bài chứa đủ 3 màu của một năng lượng bất kỳ (lửa, băng
hoặc nước).
 Khi game đấu kết thúc, client này có thể đấu lại với client kia (rematch) hoặc sẽ sẽ
trở về main menu để chơi game khác.
 Vì các cặp chơi sẽ chơi ngẫu nhiên theo lượt truy cập nên sẽ khơng có cơ sở dữ liệu
vì em cảm thấy nó không cần thiết lắm.
Triển khai các chức năng:
- Về phần client:
+ File canvas.js: quản lý các thao tác tên canvas (là xây dựng các cơ chế xử lý sự
kiện, vẽ các lá bài và tạo khung). Các hàm chính trong file này là:
 drawCard(): vẽ các lá bài được random từ server để người chơi chọn đánh
 drawUnknowCard(): vẽ các lá bài ẩn để đối phương không thể thấy bài mình
đánh

 handleMouseUp(), handleMouseDown(): xử lý các sự kiện khi click lá bài
thì lá bài sẽ được đánh lên và sau đó so sánh với nhau
+ File game_client,js: quản lý các tác vụ logic của các client, và cũng xử lý kết
nối với socket.io server. Các hàm chính trong file này:
 enterQueue(): Hàm gọi lên server để xử lý sự kiện tìm kiếm người chơi
 enterMatch(): Hàm lắng nghe sự kiện sau khi server gọi để thực hiện các
chức năng: tiếp tục đánh bài, hay trở về menu chính.
 handleMouseUp(), handleMouseDown(): xử lý các sự kiện khi click lá bài
thì lá bài sẽ được đánh lên và sau đó so sánh với nhau
 displayResult(): hiển thị kết quả sau lượt chơi
- Về phần server:
+ File game_manager.js: xử lý tất cả các kết nối socket.io từ game_client và quản
lý logic trò chơi bên máy chủ. Các hàm chính của file này:
 enterQueue(): kết nối các client với nhau (2 client vào một lượt chơi)
12


 enterQueue (): rời trận đấu
 playCard(): đánh bài
 updateCardsRequested: Update lại những lá bài sau khi đánh ở lượt trước
 handleMouseUp(), handleMouseDown(): xử lý các sự kiện khi click lá bài
thì lá bài sẽ được đánh lên và sau đó so sánh với nhau
 shuffleDeck(): xáo bài
+ File server.js: Xử lý các socket.io và giao diện bên client, chứa các tác vụ trong
file game_manager.js

2. Giao diện
Giao diện Trang chủ:

Giao diện tìm người chơi:


13


Giao diện đang chơi:

Giao diện hiện kết quả:

14


3. Đánh giá kết quả
Chương trình đã hồn thành các chức năng:
● Server có thể nhận kết nối từ nhiều client
● Các client có thể đánh bài với nhau
● Chức năng chờ người chơi khác
● Tổng hợp bài và chọn ra người chiến thắng

15


CHƯƠNG 3: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN
1. Kết luận
Đã xây dựng được chương trình với chức năng như đã đề ra. Thông qua đề tài, ta đã
hiểu được cách hoạt động của giao thức websocket trong nodejs. Ta cũng biết thêm một
số framework trong nodejs để xử lý các sự kiện (express.js) và tạo giao diện (pug html)
và ưng ý, cũng như cách deploy project lên heroku để ai cũng có thể sử dụng ứng dụng
này.
Mã nguồn: />
2. Hướng phát triển

● Tạo nhiều phòng để nhiều người chơi hơn
● Xây dựng giao diện đẹp hơn
● Bảng xếp hạng người chơi có số chiến thắng cao nhất đến thấp nhất

16


PHẦN II. NGUYÊN LÝ HỆ ĐIỀU HÀNH
Đề tài: Ứng dụng cơ chế multithread để giải bài tốn hệ phương trình

CHƯƠNG 1. CƠ SỞ LÝ THUYẾT VÀ TỔNG QUAN VỀ ĐỀ TÀI
1. Cơ sở lý thuyết
1.1: Thread là gì ? Multithread là gì ?
Thread (luồng) về cơ bản là một tiến trình con (sub-process). Một đơn vị xử lý
nhỏ nhất của máy tính có thể thực hiện một cơng việc riêng biệt. Trong java, các
luồng được quản lý bởi máy ảo java (JVM)
Multithread (đa luồng) là một tiến trình thực hiện nhiều luồng đồng thời. Một
ứng dụng java ngồi luồng chính có thể có các luồng khác thực thi đồng thời làm
ứng dụng chạy nhanh và hiệu quả hơn.
Vd: Trình duyệt web hay các chương trình chơi nhạc là một ví dụ điển hình về
đa luồng.
● Khi duyệt một trang web, có rất nhiều hình ảnh, css, javascript... được tải
đồng thời bởi các luồng khác nhau.
● Khi play nhạc, chúng ta vẫn có thể tương tác được với nút điều khiển
như: Play, pause, next, back... vì luồng phát nhạc là luồng riêng biệt với
luồng tiếp nhận tương tác của người dùng.
1.2: Đa nhiệm (multitasking)
Multitalking là khả năng chạy đồng thời một hoặc nhiều chương trình cùng một
lúc trên một hệ điều hành. Hệ điều hành quản lý việc này và sắp xếp lịch phù hợp
cho các chương trình đó. Ví dụ trên hệ điều hành windows chúng ta có thể làm việc

đồng thời với các chương trình khác nhau như: Microsoft word, excel, media
player…
Đa nhiệm có thể đạt được bằng hai cách:
● Đa nhiệm dựa trên tiến trình (Process) – Đa tiến trình (Multiprocessing).
○ Mỗi tiến trình có địa chỉ riêng trong bộ nhớ, tức là mỗi tiến trình phân
bổ vùng nhớ riêng biệt.
○ Tiến trình là nặng.
○ Sự giao tiếp giữa các tiến trình có chi phí cao.
○ Chuyển đổi từ tiến trình này sang tiến trình khác địi hỏi thời gian để
đăng ký việc lưu và tải các bản đồ bộ nhớ, các danh sách cập nhật, …
● Đa nhiệm dựa trên luồng (Thread) – Đa luồng (MultiThreading).
○ Các luồng chia sẻ không gian địa chỉ ô nhớ giống nhau.
○ Luồng là nhẹ.
17


○ Sự giao tiếp giữa các luồng có chi phí thấp.
Đa tiến trình (multiprocessing) và đa luồng (multithreading) cả hai được sử
dụng để tạo ra hệ thống đa nhiệm (multitasking). Nhưng chúng ta sử dụng đa luồng
nhiều hơn đa tiến trình bởi vì các luồng chia sẻ một vùng bộ nhớ chung. Chúng
không phân bổ vùng bộ nhớ riêng biệt để tiết kiệm bộ nhớ, và chuyển đổi ngữ cảnh
giữa các luồng mất ít thời gian hơn tiến trình.
1.2: Ưu điểm của đa luồng.
Nó khơng chặn người sử dụng vì các luồng là độc lập và bạn có thể thực hiện
nhiều cơng việc cùng một lúc.
Mỗi luồng có thể dùng chung và chia sẻ nguồn tài nguyên trong quá trình
chạy, nhưng có thể thực hiện một cách độc lập.
Luồng là độc lập vì vậy nó khơng ảnh hưởng đến luồng khác nếu ngoại lệ xảy
ra trong một luồng duy nhất.
Có thể thực hiện nhiều hoạt động với nhau để tiết kiệm thời gian. Ví dụ một

ứng dụng có thể được tách thành : luồng chính chạy giao diện người dùng và các
luồng phụ nhiệm gửi kết quả xử lý đến luồng chính.
1.3: Nhược điểm của đa luồng.
Càng nhiều luồng thì xử lý càng phức tạp.
Xử lý vấn đề về tranh chấp bộ nhớ, đồng bộ dữ liệu khá phức tạp.
Cần phát hiện tránh các luồng chết (dead lock), luồng chạy mà khơng làm gì
trong ứng dụng cả.
1.4: Vịng đời của một thread trong java

NEW : Đây là trạng thái khi luồng vừa được khởi tạo bằng phương thức khởi
tạo của lớp Thread nhưng chưa được start(). Ở trạng thái này, luồng được tạo ra
18


nhưng chưa được cấp phát tài nguyên và cũng chưa chạy. Nếu luồng đang ở trạng
thái này mà ta gọi các phương thức ép buộc stop,resume,suspend … sẽ là nguyên
nhân sảy
Xử lý vấn đề về tranh chấp bộ nhớ, đồng bộ dữ liệu khá phức tạp.
Cần phát hiện tránh các luồng chết (dead lock), luồng chạy mà khơng làm gì
trong ứng dụng cả.
RUNNABLE : Sau khi gọi phương thức start() thì luồng test đã được cấp phát
tài nguyên và các lịch điều phối CPU cho luồng test cũng bắt đầu có hiệu lực. Ở
đây, chúng ta dùng trạng thái là Runnable chứ khơng phải Running, vì luồng khơng
thực sự ln chạy mà tùy vào hệ thống mà có sự điều phối CPU khác nhau.
WAITING : Thread chờ không giới hạn cho đến khi một luồng khác đánh
thức nó.
TIMED_WAITING : Thread chờ trong một thời gian nhất định, hoặc là có
một luồng khác đánh thức nó.
BLOCKED: Đây là 1 dạng của trạng thái “Not Runnable”, là trạng thái khi
Thread vẫn còn sống, nhưng hiện tại không được chọn để chạy. Thread chờ một

monitor để unlock một đối tượng mà nó cần.
TERMINATED : Một thread ở trong trạng thái terminated hoặc dead khi
phương thức run() của nó bị thốt.
1.5: Cách tạo Thread trong java
Có hai cách tạo thread trong java:
● Tạo luồng bằng cách extend từ lớp Thread.
● Tạo luồng bằng cách implement từ interface Runnable
Cách hay được sử dụng và được u thích hơn là dùng Interface Runnable,
bởi vì nó khơng yêu cầu phải tạo một lớp kế thừa từ lớp Thread. Trong trường hợp
ứng dụng thiết kế yêu cầu sử dụng đa kế thừa, chỉ có interface mới có thể giúp giải
quyết vấn đề. Ngoài ra, Thread Pool rất hiệu quả và có thể được cài đặt, sử dụng rất
đơn giản.
Trong các trường hợp cịn lại ta có thể kế thừa từ lớp Thread.
1.6: Các phương thức của lớp Thread thường hay sử dụng
suspend() : Đây là phương thức làm tạm dừng hoạt động của 1 luồng nào đó
bằng các ngưng cung cấp CPU cho luồng này. Để cung cấp lại CPU cho luồng ta sử
dụng phương thức resume(). Cần lưu ý 1 điều là ta không thể dừng ngay hoạt động
của luồng bằng phương thức này. Phương thức suspend() khơng dừng ngay tức thì
hoạt động của luồng mà sau khi luồng này trả CPU về cho hệ điều hành thì khơng
cấp CPU cho luồng nữa.

19



×