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

Báo cáo đồ án Cơ Sở Ngành 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 (730.73 KB, 40 trang )

Báo cáo đồ án Cơ Sở Ngành Mạng

ĐẠI HỌC ĐÀ NẴNG

TRƯỜNG ĐẠI HỌC BÁCH KHOA

KHOA CÔNG NGHỆ THÔNG TIN
Tel. (84-236) 736 949, Fax. (84-236) 842 771
Website: itf.ud.edu.vn, E-mail:

BÁO CÁO ĐỒ ÁN
CƠ SỞ NGÀNH MẠNG

MỤC LỤC

1


Báo cáo đồ án Cơ Sở Ngành Mạng

DANH SÁCH HÌNH VẼ

2


Báo cáo đồ án Cơ Sở Ngành Mạng

DANH SÁCH BẢNG BIỂU

3



Báo cáo đồ án Cơ Sở Ngành Mạng

LỜI MỞ ĐẦU
Nguyên lý hệ điều hành và Lập trình Mạng là những nền tảng mà người lập trình
phải hiểu rõ để có thể nắm bắt các kiên thức cao hơn.
Hệ điều hành là thành phần trung gian, là cầu nối cho sự giao tiếp giữa người dung
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.
Cũng như vậy, với sự phát triển trong lĩnh vực mạng hiện nay, thì việc nghiên cứu,
nắm vững về Mạng là thực sự quan trọng đối với người lập trình.
Dựa trên những hiểu biết của mình và tham khảo thêm, em đã thực hiện, nghiên cứu
về 2 đề tài: Tìm hiểu về kỹ thuật Hook, xây dựng chương trình gõ tắt và Xây dựng
game cờ gánh cho phép nhiều người cùng chơi trên mạng.
Em xin chân thành cảm ơn thầy cô giáo trong khoa Công Nghệ Thông Tin, và hơn
hết là thầy Nguyễn Tấn Khôi đã nhiệt tình theo dõi, hướng dẫn em nhiệt tình trong
quá trình em thực hiện đề tài này.
Em đã rất cố gắng hoàn thành đề tài, nhưng không thể tránh khỏi những thiếu sót,
mong nhận được sự góp ý của thầy cô để em hoàn thiện đề tài hơn.

4


Báo cáo đồ án Cơ Sở Ngành Mạng

PHẦN 1: NGUYÊN LÝ HỆ ĐIỀU HÀNH
TIÊU ĐỀ: XÂY DỰNG ỨNG DỤNG GÕ TẮT
Tìm hiêu kỹ thuật lập trình Hook. Xây dựng ứng dụng gõ tắt.
Sử dụng ngôn ngữ lập trình C#.


CHƯƠNG 1. CƠ SỞ LÝ THUYẾT
1. Giới thiệu Hook
Trong Windows, khi chúng ta thực hiện các thao tác nhấp chuột, nhấn phím… thì
hệ điều hành sẽ chuyển các sự kiện này thành các thông điệp (message) rồi đưa vào
hàng đợi (queue) của hệ thống. Sau đó, các thông điệp được trao lại cho từng ứng
dụng cụ thể để xử lý.
Hook là một cơ chế mà một ứng dụng có thể chặn các sự kiện, như các thông điệp,
thao tác chuột, bàn phím. Hàm dùng để chặn một loại sự kiện riêng biệt được gọi là
hook procedure/ hook function. Mỗi khi nhận được sự kiện, hook procedure có thể
thay đổi và thậm chí hủy bỏ các sự kiện đó.
Xét ở phạm vi hoạt động thì có 2 loại Hook:
-

Local hook (thread hook): chỉ có ảnh hưởng trong phạm vi một thread.

Global hook: có ảnh hưởng trong toàn hệ thống. Trường hợp này, hook
procedure phải được chứa trong một thư viện DLL.
Một số ví dụ sử dụng hook:
-

Tạo các chức năng debug

-

Tạo các chương trình record và play back macro

-

Bắt giả lập các sự kiện bàn phím và chuột


-

Tạo chức năng Help(F1) cho ứng dụng

-

Tạo các ứng dụng computer-based training (CBT)

2. Cơ chế của Hook – Hook chain

Hệ điều hành luôn duy trì một danh sách các hook procedure cho mỗi loại sự kiện.
Mỗi danh sách các Hook procedure này được gọi là hook chain. Bản chất của hook
chain là một dãy các con trỏ hàm trỏ đến các Hook procedure.
Khi hệ thống thực một sự kiện nào đó, nó sẽ tìm kiếm trong hook chain tương ứng
với sự kiện đó. Nếu một hook procedure phù hợp được tìm thấy, hệ thống sẽ thực
hiện nó và chỉ lấy lại quyền điều khiển sau khi hook chain kết thúc. Vì thế khi một
hook procedure thực hiện xong, nó phải thực hiện việc chuyển quyền điều khiển
cho hook procedure kế tiếp trong hook chain.
Tuy nhiên cơ chế này còn tùy thuộc vào loại hook. Như một số loại hook chỉ có thể
theo dõi các thông điệp, vì vậy cho dù hook procedure có chuyển quyền điều khiển
cho hook procedure kế tiếp hay không, hệ thống vẫn sẽ tự động làm việc này.
Hook là một kỹ thuật xử lý thông điệp rất mạnh cho phép chúng ta can thiệp sâu
vào các tiến trình khác nhau, nhưng nó làm ảnh hưởng tới tốc độ của hệ thống, nhất
là hook system-wide, vì tất cả các sự kiện của hệ thống sẽ được định hướng tới một
5


Báo cáo đồ án Cơ Sở Ngành Mạng
hàm nào đó, rõ ràng điều này làm hệ thống chậm đi đáng kể. Vì thế ta chỉ hên hook
những thông điệp thật cần thiết và kết thúc việc hook ngay khi không dùng đến nữa.


Hình 1 Hook chain

3. Các loại Hook
Có nhiều loại hook được phân biệt dựa vào các sự kiện, thông điệp mà Hook
procedure can thiệp vào. Danh sách dưới đây liệt kê các loại hook kèm với link dẫn
đến tham khảo từ MSDN:
-

WH_CALLWNDPROC and WH_CALLWNDPROCRET

-

WH_CBT

-

WH_DEBUG

-

WH_FOREGROUNDIDLE

-

WH_GETMESSAGE

-

WH_JOURNALPLAYBACK


-

WH_JOURNALRECORD

-

WH_KEYBOARD_LL

-

WH_KEYBOARD

-

WH_MOUSE_LL

-

WH_MOUSE

-

WH_MSGFILTER and WH_SYSMSGFILTER

-

WH_SHELL

4. Hook Procedure

Hook procedure là một loại callback function. Hệ thống sẽ gọi các hàm này khi các
sự kiện, thông điệp tương ứng với loại hook. Mỗi loại hook có một hook procedure
khác nhau nhưng đều có cùng tham số như cú pháp bên dưới. Với mỗi hook
procedure khác nhau thì việc xét các giá trị tham số cũng khác nhau.
Lập trình viên sử dụng dụng hàm SetWindowsHookEx để cài đặt một hook
procedures vào hook chain.
6


Báo cáo đồ án Cơ Sở Ngành Mạng
Một hook procedures có cú pháp như sau:
LRESULT CALLBACK HookProc(
int nCode,
WPARAM wParam,
LPARAM lParam
)
{
//process event
...
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
Ý nghĩa tham số truyền vào trong hàm:
nCode : tham số này thường được gọi là “hook code”, Hook procedure sử
dụng giá trị này để quyết định cách thức xử lý đối với sự kiện. Giá trị của hook code
tùy thuộc vào từng loại hook cụ thể, và mỗi loại hook sẽ có tập hợp những giá trị
hook code đặc trưng của riêng mình.
Có một quy luật mà dường như các Hook procedure của mọi loại hook cần tuân thủ:
khi Window truyền cho hàm giá trị hook code âm, Hook procedure không được xử
lý sự kiện mà phải gọi hàm CallNextHookEx với chính những tham số mà hệ điều
hành truyền cho nó. Sau đó, nó phải trả về giá trị được trả về bởi hàm

CallNextHookEx.
wParam, lParam: Đây là những thông tin cần thiết cho Hook procedure trong
quá trình xử lý sự kiện. Các giá trị này sẽ có ý nghĩa khác nhau tuỳ thuộc vào từng
loại hook.
Ví dụ: Hook procedure gắn với hook WH_KEYBOARD sẽ nhận mã phím ảo
(Virtual-Key Code) từ wParam, đồng thời có được từ lParam thông tin mô tả trạng
thái của bàn phím khi sự kiện gõ phím xảy ra.
5. Cài đặt hook
5.1 Cài đặt một Filter Function vào chuỗi các Filter Function
Tác vụ này được thực hiện thông qua hàm SetWindowsHookEx

Cú pháp:
HHOOK WINAPI SetWindowsHookEx(

7


Báo cáo đồ án Cơ Sở Ngành Mạng
_In_ int

idHook,

_In_ HOOKPROC lpfn,
_In_ HINSTANCE hMod,
_In_ DWORD

dwThreadId

);
Tham số:

- idHook: Xác định loại hook mà ta muốn cài đặt, tham số này
có thể là một trong các giá trị sau:
• WH_CALLWNDPROC : đặt một thủ tục hook quản lý các thông
điệp trước lúc hệ thống gởi chúng tới cửa sổ đích.
• WH_CALLWNDPROCRET : đặt một thủ tục hook quản lý các thông
điệp sau khi chúng được xử lý bởi thủ tục cửa sổ đích.
• WH_CBT : đặt một thủ tục hook nhận những thông báo có ích tới
ứng dụng huấn luyện trên cơ sở tính toán (CBT).
• WH_DEBUG : đặt một thủ tục hook có ích cho việc debug những
thủ tục hook khác.
• WH_FOREGROUNDIDLE : đặt một thủ tục hook sẽ được gọi khi
thread foreground của ứng dụng sẽ trở thành không dùng đến.
Hook này có ích cho hoạt động những nhiệm vụ (task) độ ưu tiên
thấp trong thời gian không được dùng đến.
• WH_GETMESSAGE : đặt một thủ tục hook quản lý các thông điệp
được post tới hàng đợi thông điệp.
•WH_JOURNALPLAYBACK : đặt một thủ tục hook post những thông
điệp được ghi trước đó bởi thủ tục hook WH_JOURNALRECORD.
•WH_JOURNALRECORD : đặt một thủ tục hook ghi những thông
điệp đầu vào được post tới hàng thông điệp hệ thống. Hook này có
ích cho việc ghi các macro.
• WH_KEYBOARD : đặt một thủ tục hook quản lý các thông điệp
keystroke.
• WH_MOUSE : đặt một thủ tục hook quản lý các thông điệp chuột.
• WH_MSGFILTER: đặt một thủ tục hook quản lý các thông điệp
được kết sinh như là một kết quả cuả sự kiện đầu vào ở trong
dialog box, message box, menu hay scroll bar.
• WH_SYSMSGFILTER : đặt một ứng dụng các thông điệp được kết
sinh như là kết quả của một sự kiện đầu vào ở trong dialog box,
message box, menu hay scroll bar. Thủ tục hook quản lý những

thông điệp này cho tất cả các ứng dụng trong hệ thống.
Mỗi giá trị trên xác định một loại hook mà ta muốn cài đặt, mỗi loại
hook có một ý nghĩa và tình huống sử dụng khác nhau.
- lpfn: Địa chỉ của Hook procedure mà ta muốn gắn với hook.
8


Báo cáo đồ án Cơ Sở Ngành Mạng
- hMod: Handle của module chứa hook procedure. Nếu ta cài đặt
một hook cục bộ (nghĩa là sự thực thi của hook procedure chỉ ảnh
hưởng đối với tiến trình cài đặt hook), tham số này phải là NULL.
Còn nếu chúng ta muốn có một hook với phạm vi toàn hệ thống
(tức là mọi tiến trình đang hiện hữu đều chịu ảnh hưởng bởi hook
procedure của chúng ta), tham số này sẽ là Handle của DLL chứa
hook procedure.
- dwThreadID: Định danh của thread ứng với hook đang được cài
đặt . Nếu tham số này là một số khác 0, hook procedure được gắn
với hook chỉ được gọi trong ngữ cảnh của một thread xác định. Còn
nếu dwThreadID = 0, hook procedure sẽ có phạm vi toàn hệ thống,
và dĩ nhiên, nó sẽ được gọi trong ngữ cảnh của bất kỳ thread nào
đang tồn tại trên HĐH. Có thể sử dụng hàm GetCurrentThreadId để
lấy được handle của thread muốn cài đặt hook.
Một hook có thể được sử dụng ở mức hệ thống, ở mức cục bộ, hoặc
ở cả hai mức vừa nêu. Bảng sau mô tả các loại hook cùng tầm ảnh
hưởng của nó:
Bảng 1. Các loại hook và tầm ảnh hưởng

Name

Valu Scope

e

Hook procedure

WH_CALLWNDPROC

4

CallWndProc

WH_CALLWNDPROCRE
T
WH_CBT

12

WH_DEBUG

9

WH_FOREGROUNDIDL
E
WH_GETMESSAGE

11

WH_JOURNALPLAYBAC
K
WH_JOURNALRECORD


1

Thread or
global
Thread or
global
Thread or
global
Thread or
global
Thread or
global
Thread or
global
Global only

0

Global only

WH_KEYBOARD

2

WH_KEYBOARD_LL

13

Thread or
global

Global only

WH_MOUSE

7

WH_MOUSE_LL

14

5

3

Thread or
global
Global only

9

CallWndRetProc
CBTProc
DebugProc
ForegroundileProc
GetMsgProc
JournalPlayBackPro
c
JournalRecordProc
KeyboardProc
LowLevelKeyboardP

roc
MouseProc
LowLevelMousePro
c


Báo cáo đồ án Cơ Sở Ngành Mạng
WH_MSGFILTER

-1

WH_SHELL

10

WH_SYSMSGFILTER

6

Thread or
global
Thread or
global
Global only

MessageProc
ShellProc
SysMsgProc

Với một loại hook xác định, hook cục bộ sẽ được gọi trước, sau đó

là hook toàn cục.

Giá trị trả về:
Handle của hook nếu thành công, ngược lại trả về NULL. Giá trị này
cần thiết để sử dụng hàm UnhookWindowsHookEx. Trong trường
hợp này bạn có thể dùng hàm GetLastErrorđể lấy thông tin lỗi.
5.2 Gỡ bỏ một Filter Function ra khỏi chuỗi các Filter Function
Windows cung cấp hàm UnhookWindowsHookEx giúp chúng ta thực hiện việc
này. Khai báo của nó như sau:
BOOL WINAPI UnhookWindowsHookEx(
_In_ HHOOK hhk
);
Tham số: hhook chỉ ra hàm hook được dỡ bỏ. Đây là giá trị được trả vể bởi hàm
SetWindowsHookEx khi hàm Hook được cài đặt.
Nếu thực hiện thành công hàm trả về giá trị true, ngược lại.
Chú ý : Hàm UnhookWindowsHookEx phải được sử dụng trong sự kết hợp với hàm
SetWindowsHookEx.
5.3 Gọi Filter Function kế tiếp trong chuỗi các Filter Function
Khi một hook được cài đặt, Windows gọi hàm đầu tiên trong chuỗi các hook
procedure, và kể từ thời điểm này, trách nhiệm Windows không còn nữa. Hook
procedure hiện hành phải đảm bảo với hệ thống là có được lời gọi đến hàm kế tiếp
trong chuỗi các hook procedure. Bởi lẽ, có thể có một ứng dụng khác cũng cài đặt
cùng loại hook để thi hành một số tác vụ nào đó, và nếu như ta không cho hook
procedure của ứng dụng này tham gia xử lý sự kiện, sẽ có vấn đề rắc rối xảy ra. Vấn
đề sẽ càng trở nên nghiêm trọng nếu ứng dụng này là một chương trình thuộc hệ
thống, và rõ ràng sẽ không có gì đảm bảo cho sự an toàn của hệ thống chúng ta. Để
giải quyết vấn đề trên, hãy sử dụng hàm CallNextHookEx.
Cú pháp:
LRESULT WINAPI CallNextHookEx(
_In_opt_ HHOOK hhk,

_In_

int nCode,
10


Báo cáo đồ án Cơ Sở Ngành Mạng
_In_

WPARAM wParam,

_In_

LPARAM lParam

);
Tham số:
- hhk : là handle của hook hiện hành, giá trị này có thể lấy được từ hàm
SetWindowsHookEx khi cài đặt hook.
- nCode : chỉ định hook code để gởi đến hook kế tiếp. Hàm xử lý hook dùng giá trị
này để chỉ định xử lý thông điệp được gởi từ hook như thế nào.
- wParam: chỉ định 16 bits thông tin mở rộng của thông điệp.
- lParam: chỉ định 32 bits thông tin mở rộng của thông điệp.
Giá trị trả về: giá trị trả về là kết quả của quá trình xử lý và tùy thuộc vào thông số
nCode.
Trong một số tình huống, hook procedure hiện hành có thể không
muốn chuyển sự kiện cho hook procedure khác trong cùng một
chuỗi. Lúc này, nếu loại hook chúng ta đang cài đặt cho phép huỷ
bỏ sự kiện, và hook procedure của chúng ta cũng có cùng quyết
định là hủy bỏ, nó sẽ không phải gọi hàm CallNextHookEx.

6. Thư viện liên kết động DLL
6.1 Khái niệm
DLL là viết tắt của Dynamic Link Library – Thư viện liên kết động. Một DLL là
một thư viện mã và dữ liệu có thể được sử dụng bởi nhiều chương trình cùng một
lúc.
Bằng cách sử dụng một DLL, chương trình có thể được mô-đun hoá thành nhiều
phần riêng biệt. Ví dụ: một chương trình kế toán có thể được bán theo mô-đun. Mỗi
mô-đun có thể được nạp vào chương trình chính ở thời gian thực nếu mô-đun đó
được cài đặt. Vì các mô-đun riêng biệt, thời gian tải của chương trình là nhanh hơn
và mô-đun được chỉ được nạp khi chức năng đó được yêu cầu.
Ngoài ra, bản cập nhật, sửa lỗi sẽ dễ dàng hơn khi áp dụng cho mỗi mô-đun mà
không ảnh hưởng đến các phần của chương trình. Ví dụ: có một chương trình bảng
lương và mức thuế thay đổi hàng năm. Khi muốn thay đổi một DLL, có thể áp dụng
bản cập nhật mà không cần phải xây dựng hoặc cài đặt lại toàn bộ chương trình.
6.2 Cách thức hoạt động
Giả sử có 2 tập tin riêng biệt là "example.exe" - tập tin thực thi thông thường, và
"library.dll" – tập tin DLL được sử dụng để thực thi.
Khi tập tin "example.exe" chạy, hệ điều hành sẽ tải tập tin, tìm bảng dữ liệu bên
trong tập tin và cung cấp thông tin "This program uses the following list of
functions from the DLL file library.dll" (chương trình này sử dụng danh sách các
chức năng dưới đây từ file DLL library.dll).

11


Báo cáo đồ án Cơ Sở Ngành Mạng
Sau đó, các loader code sẽ tìm kiếm "library.dll", và nếu nó tìm thấy"library.dll" thì
các tập tin sẽ được tải.
Bên trong tập tin DLL này có chứa một danh sách khác gọi là "export list", danh
sách này kết nối các địa chỉ cụ thể cho từng chức năng nằm bên trong tập tin DLL.

Kể từ thời điểm này, khi "example.exe" cần gọi một hàm từ "library.dll",
"example.exe" chỉ cần sử dụng địa chỉ đó.
6.3 Các loại liên kết động
-

-

Liên kết không tường minh (Implicit Linking): Liên kết không tường minh hay liên
kết ở thời điểm nạp (Load-time dynamic Linking) diễn ra ở thời điểm biên dịch, khi
ứng dụng tạo một tham chiếu tới hàm DLL được export. Tại thời điểm mã nguồn
của lời gọi đó được biên dịch, lời gọi hàm DLL dịch thành một hàm tham chiếu
ngoài trong đối tượng mã. Để hiểu được tham chiếu ngoài này, ứng dụng phải liên
kết với thư viện import (file có phần mở rộng là.LIB) đã được DLL tạo ra khi biên
dịch.
Liên kết tường minh (Explicit Linking): Liên kết tường minh hay còn
gọi là liên kết ở thời điểm chạy (Run-time Dynamic Linking): sử
dụng các con trỏ hàm ở thời điểm chạy chương trình để trỏ tới các
hàm trong DLL mà ta cần sử dụng. Modul sẽ dùng hàm LoadLibrary
hoặc hàm LoadLibraryEx để nạp DLL khi nào nó muốn sử dụng
hàm trong DLL. Sau khi DLL đã được nạp, modul sử dụng hàm
GetProcAddress để lấy về địa chỉ trỏ tới hàm xuất ra trong DLL và
đưa vào một con trỏ hàm nào đó. Các thao tác tiếp theo của modul
sẽ làm việc với con trỏ hàm.
6.4 Tại sao sử dụng DLL

-

Sử dụng ít tài nguyên
Khi nhiều chương trình sử dụng cùng một thư viện hàm, một DLL có thể giảm sao
chép mã được tải vào đĩa và bộ nhớ vật lý. Điều này có thể ảnh hưởng đáng kể hiệu

suất của không chỉ chương trình đang chạy trên nền còn các chương trình khác đang
chạy trên hệ điều hành Windows.

-

Khuyến khích kiến trúc mô-đun
Một DLL giúp khuyến khích phát triển các mô-đun chương trình. Điều này giúp
bạn phát triển chương trình lớn cần nhiều phiên bản ngôn ngữ hoặc chương trình
yêu cầu kiến trúc module. Ví dụ về một chương trình mô-đun là một chương trình
kế toán có nhiều mô-đun có thể được tự động tải tại thời gian chạy.

-

Cài đặt và triển khai dễ dàng hơn
Khi chức năng trong một DLL cần bản Cập Nhật hoặc bản vá, triển khai và cài đặt
các tệp DLL không yêu cầu chương trình relinked với DLL. Ngoài ra, nếu nhiều
chương trình sử dụng cùng một DLL, nhiều chương trình sẽ lợi ích tất cả bản Cập
Nhật hoặc sửa chữa. Vấn đề này thường xuyên hơn có thể xảy ra khi bạn sử dụng
một DLL bên thứ ba được thường xuyên cập nhật hoặc khắc phục.
12


Báo cáo đồ án Cơ Sở Ngành Mạng

CHƯƠNG 2. PHÂN TÍCH THIẾT KẾ HỆ THỐNG
1. Yêu cầu chức năng

-

Chương trình được thiết kế để thay thế một số kí tự ngắn thành các cụm từ quen

thuộc được lưu trữ trong cơ sơ sở dữ liệu. Nhằm mục đích tăng tốc độ gõ cho người
sử dụng.
Một số yêu cầu của chương trình:
Lưu trữ các cụm từ viết tắt trong cơ sỡ dữ liệu.
Thay thế các từ viết tắt thành cụm từ đo người dùng định nghĩa.

2. Yêu cầu giao diện
Xây dựng giao diện cho người dùng nhập, chỉnh sửa, xóa và xem các từ viết tắt đã
định nghĩa. Có các nút nhấn để chạy và dừng chương trình.
3. Thuật toán
B1. Khởi tạo 1 chuỗi text lưu trữ chuỗi kí tự từ người dùng nhập.
B2. Cài đặt hook procedure bắt các sự kiện thay đổi cửa sổ người dùng.
Nếu có sự thay đổi cửa sổ thì xóa trống chuỗi text.
B3. Cài đặt một hook procedure bắt tất cả các sự kiện bàn phím của người dùng.
Với mỗi phím được nhấn và nhả kiểm tra kí tự vừa nhập nếu phù hợp thì thêm vào
chuỗi text.
B4. Nếu người dùng nhấn SPACE_BAR tìm chuỗi text trong csdl
Nếu tồn tại:
-

Thực hiện xóa các kí tự vừa nhập bằng cách giả lập nhấn n lần phím Backspace

-

Gửi cụm từ thay thế đến cửa sổ đang focus

-

Gửi kí tự SPACE


-

Xóa trống chuỗi text
Nếu không tồn tại:

-

Xóa trống chuỗi text
13


Báo cáo đồ án Cơ Sở Ngành Mạng
4. Cơ sở dữ liệu
Chương trình sử dụng sqlite để lưu trữ các kí tự ví tắt.
Các từ viết tắt và nghĩa của nó được lưu trữ trong table word.

Hình 2. Cấu trúc table word

14


Báo cáo đồ án Cơ Sở Ngành Mạng

CHƯƠNG 3. TRIỂN KHAI ĐÁNH GIÁ KẾT QUẢ
1. Triển khai
1.1 Môi trường triển khai
Ứng dụng được phát triển trên
Microsoft Visual Studio Community2015 Version 14.0.25431.01
Microsoft .NET Framework Version 4.7.02046
Sử dụng thư viện sqlite 1.0.105.1

1.2 Cấu trúc project

Hình 3. Cấu trúc project ứng dụng gõ tắt

2. Kết quả
15


Báo cáo đồ án Cơ Sở Ngành Mạng

Hình 4. Giao diện ứng dụng gõ tắt

3. Đánh giá kết quả
Về cơ bản ứng dụng đã đáp ứng các yêu cầu đặt ra. Trong quá trình chạy thử ứng
dụng, các kí tự viết tắt mà người dùng sử dụng đều được thay thế dù đang trong bất
kì cửa sổ nào.
Tuy nhiên, ứng dụng vẫn còn một vài nhược điểm, cụ thể là không xác định được kí
tự viết tắt khi người dùng sao chép và xóa một đoạn hay khi chuyển đổi cửa sổ một
thời gian.

KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN
1. Những kết quả đạt được
Hiểu được cơ chế hoạt động của hook trên window và biết sử dụng các hàm của
WINAPI.
Xây dựng được chương trình hoạt động tốt và không gặp lỗi khi
chạy, thay thế được các kí tự viết tắt theo đúng yêu cầu đặt ra.

16



Báo cáo đồ án Cơ Sở Ngành Mạng
2. Những vấn đề còn tồn tại
Chưa thay thế được cụm từ viết tắt khi người dùng thao tác copy và xóa một đoạn
văn bản hay khi người dùng gõ một phần kí tự sau đó chuyển đổi cửa sổ rồi quay
lại.
Chương trình hoạt động không được tốt khi chạy cùng một số phần mềm sử dụng kĩ
thuật hook phím ví dụ: Unikey.
3. Hướng phát triển
Khắc phục những vấn đề còn tồn đọng trong chương trình.
Có thể xây dụng chức năng nhắc từ khi gõ như plugin autocomplete của một số
trình soạn thảo văn bản.

17


Báo cáo đồ án Cơ Sở Ngành Mạng

PHẦN 2: LẬP TRÌNH MẠNG
TIÊU ĐỀ: XÂY DỰNG GAME CỜ GÁNH
Sử dụng Socket trong Java xây dựng trò chơi Cờ gánh Online theo mô hình ClientServer.

CHƯƠNG 1. CƠ SỞ LÝ THUYẾT
1. Socket
1.1 Khái niệm và các đặc tính cơ bản

Socket là một model của Java, dùng để tạo ra các giao tiếp giữa các máy tính với
nhau. Nó là điểm giao tiếp (endpoint) khi thực hiện quá trình liên kết truyền nhận
dữ liệu.
Socket có thể có 2 luồng: một luồng dữ liệu vào (input stream), và 1 luồng dữ liệu
ra (output stream). Máy này gửi dữ liệu cho máy khác thông qua đường mạng, tạo

một output stream đính kèm với socket, và máy tính nhận thì cần input stream với
socket của nó để nhận dữ liệu.
Lớp Socket của Java được sử dụng cả client và server.
Một socket có thể thực hiện bảy thao tác cơ bản:
-

Kết nối với một máy ở xa (để gửi và nhận dữ liệu)
Gửi dữ liệu
Nhận dữ liệu
Ngắt liên kêt
Gán cổng
Nghe dữ liệu đến
Chấp nhận liên kết từ các máy ở xa trên cổng được gán
Có các phương thức tương ứng với bốn thao tác đầu tiên.
Ba thao tác cuối chỉ cần cho server để chờ các client liên kết với chúng.
Các thao tác này được cài đặt bởi lớp ServerSocket.

1.2 Các constructor

public Socket(String host, int port) throws UnknownHostException, IOException
Hàm này tạo một socket TCP với host và cổng xác định và thực
hiện liên kết với host ở xa.
public Socket(InetAddress host, int port) throws IOException
Constructor này tạo một socket TCP với thông tin là địa chỉ của một host được xác
định bởi một đối tượng InetAddres và số hiệu cổng port, sau đó nó thực hiện kết nối
tới host.
Constructor đưa ra ngoại lệ trong trường hợp không kết nối được tới host.
public Socket (String host, int port, InetAddress interface, int localPort) throws
IOException, UnknownHostException
18



Báo cáo đồ án Cơ Sở Ngành Mạng
Constructor này tạo ra một socket với thông tin là địa chỉ IP được biểu diễn bởi một
đối tượng String và một số hiệu cổng và thực hiện kết nối tới host đó. Socket kết nối
tới host ở xa thông qua một giao tiếp mạng và số hiệu cổng cục bộ.
Nếu localPort bằng 0 thì Java sẽ lựa chọn một cổng ngẫu nhiên có sẵn nằm trong
khoảng từ 1024 đến 65535.
public Socket (InetAddress host, int port, InetAddress interface, int localPort)
throws IOException, UnknownHostException
Constructor này chỉ khác constructor trên ở chỗ địa chỉ của host lúc này được biểu
diễn bởi một đối tượng InetAddress.
1.3 Hàm lấy thông tin Socket

public InetAddress getInetAddress(): Cho ta biết host ở xa mà Socket kết nối tới,
hoặc liên kết đã bị ngắt thì nó cho biết host ở xa mà Socket đã kết nối tới.
public int getPort(): Cho biết số hiệu cổng mà Socket kết nối tới trên host ở xa.
public int getLocalPort(): Tìm ra số hiệu cổng ở phía host cục bộ (thông thường
một liên kết có hai đầu: host ở xa và host cục bộ).
public InetAddress getLocalAddress(): Cho biết giao tiếp mạng nào mà một socket
gắn kết với nó.
public InputStream getInputStream() throws IOException: Trả về một luồng nhập
để đọc dữ liệu từ một socket vào chương trình.
public OutputStream getOutputStream() throws IOException: Trả về một luồng
xuất để ghi dữ liệu từ ứng dụng ra đầu cuối của một socket.
public void close() throws IOException: Các socket được đóng một cách tự động
khi một trong hai luồng đóng lại, hoặc khi chương trình kết thúc, hoặc khi socket
được thu hồi.
1.4 Lớp ServerSocket


Lớp SeverSocket thì được sử dụng để đại diện cho Sever trong việc giao tiếp giữa
chương trình client với chương trình server. ServerSocket có 1 ràng buộc cụ thể bởi
1 cổng nào đó và nó có thể truy cập từ Client. Nếu cổng này được sử dụng bởi một
ứng dụng khác thì nó sẻ ném ra một exception.
Nếu lớp ServerSocket thì kết nối thành công , thì nó sẻ phải chờ đợi và lắng nghe từ
những yêu cầu của Client được thiết lập.
Vòng đời của một server:
-

Một ServerSocket mới được tạo ra trên một cổng xác định bằng cách sử dụng một
constructor ServerSocket.

19


Báo cáo đồ án Cơ Sở Ngành Mạng
-

ServerSocket lắng nghe liên kết đến trên cổng đó bằng cách sử dụng phương thức
accept().
Phương thức accept(): Phong tỏa cho tới khi một client thực hiện một liên kết, nó
trả về một đối tượng Socket mà liên kết giữa client và server.

-

Tùy thuộc vào kiểu server, hoặc phương thức getInputStream(), getOutputStream()
hoặc cả hai được gọi để nhận các luồng vào ra để truyền tin với client.

-


Server và client tương tác theo một giao thức thỏa thuận sẵn cho tới khi ngắt liên
kết.
Server, client hoặc cả hai ngắt liên kết.
Server trở về bước hai và đợi liên kết tiếp theo.

2. Mô hình Client – Server
2.1 Khái niệm và đặc tính cơ bản

Mô hình client-server là một mô hình nổi tiếng trong mạng máy tính, là một dạng
phổ biến của mô hình ứng dụng phân tán, được áp dụng rất rộng rãi và là mô hình
của mọi trang web hiện có.
Ý tưởng của mô hình này là máy con (đóng vài trò là máy khách) gửi một yêu cầu
(request) để máy chủ (đóng vai trò người cung ứng dịch vụ), máy chủ sẽ xử lý và trả
kết quả về cho máy khách.
Mô hình client/server cung cấp một cách tiếp cận tổng quát để chia sẻ tài nguyên
trong các hệ thống phân tán.
Cả tiến trình client và tiến trình server đều có thể chạy trên cùng một máy tính.
Một tiến trình server có thể sử dụng dịch vụ của một server khác.
Mô hình truyền tin client/server hướng tới việc cung cấp dịch vụ.
Client và Server giao tiếp với nhau thông qua một chuẩn chung gọi là giao thức.
Một chương trình Client muốn liên kết và gửi yêu cầu đến một Server thì phải tuân
theo giao thức mà Server đó đưa ra.
Các ứng dụng Client-Server phổ biến: Email, FTP, Web,…
2.2 Cách thức hoạt động

Quá trình trao đổi dữ liệu trong mô hình Client-Server bao gồm:
-

Bước 1 : Truyền một yêu cầu từ tiến trình client tới tiến trình server


-

Bước 2 : Yêu cầu được server xử lý

-

Bước 3 : Truyền đáp ứng cho client
Mô hình truyền tin này liên quan đến việc truyền hai thông điệp và được đồng bộ
hóa giữa client và server.

20


Báo cáo đồ án Cơ Sở Ngành Mạng
Ở bước 1, tiến trình server phải nhận thức được thông điệp được yêu cầu ngay khi
nó đến và hành động phát ra yêu cầu trong client phải được tạm dừng.
Ở bước 3, tiến trình client ở trạng thái chờ cho đến khi nó nhận được đáp ứng do
server gửi về.
Các chế độ trao đổi dữ liệu giữa client với server:
+ Chế độ phong toả (blocked)
Khi tiến trình client hoặc server phát ra lệnh gửi dữ liệu (send), việc thực thi của
tiến trình sẽ bị tạm ngừng cho tới khi tiến trình nhận phát ra lệnh nhận dữ liệu
(receive).
Tương tự đối với tiến trình nhận dữ liệu, nếu tiến trình client hoặc server phát ra
lệnh nhận dữ liệu, mà tại thời điểm đó chưa có dữ liệu gửi tới thì việc thực thi của
tiến trình cũng sẽ bị tạm ngừng cho tới khi có dữ liệu gửi tới.
+ Chế độ không bị phong tỏa (non-blocked)
Trong chế độ này, khi tiến trình client hay server phát ra lệnh gửi dữ liệu thực sự,
việc thực thi của tiến trình vẫn được tiến hành mà không quan tâm đến việc có tiến
trình nào phát ra lệnh nhận dữ liệu đó hay không.

Tương tự cho trường hợp nhận dữ liệu, khi tiến trình phát ra lệnh nhận dữ liệu, nó
sẽ nhận dữ liệu hiện có, việc thực thi của tiến trình vẫn được tiến hành mà không
quan tâm đến việc có tiến trình nào phát ra lệnh gửi dữ liệu tiếp theo hay không.
2.3 Các kiến trúc Client – Server

2.3.1 Client – Server 2 tầng

Hình 5. Mô hình client - server 2 tầng

Trong ứng dụng hai tầng truyền thống, khối lượng công việc xử lý được dành cho
phía client.

21


Báo cáo đồ án Cơ Sở Ngành Mạng
Khi đó server chỉ đóng vai trò như là chương trình kiểm soát luồng vào ra giữa ứng
dụng và dữ liệu.
Hiệu năng của ứng dụng bị giảm đi do tài nguyên hạn chế của PC và khối lượng dữ
liệu truyền đi trên mạng cũng tăng theo
2.3.2 Client – Server 3 tầng
Ta có thể tránh được các vấn đề của kiến trúc client/server hai tầng bằng cách mở
rộng kiến trúc thành ba tầng.
Một kiến trúc ba tầng có thêm một tầng mới tách biệt việc xử lý dữ liệu ở vị trí
trung tâm.

Hình 6. Mô hình client - server 3 tầng

Theo kiến trúc ba tầng, một ứng dụng được chia thành ba tầng tách biệt nhau:
-


Tầng đầu tiên : là tầng trình diễn thường bao gồm các giao diện đồ họa. Tầng trình
diễn nhận dữ liệu và định dạng nó để hiển thị.

-

Tầng thứ hai : là tầng trung gian hay tầng tác nghiệp.

-

Tầng thứ ba : chứa dữ liệu cần thiết cho ứng dụng. Tầng thứ ba về cơ bản là chương
trình thực hiện các lời gọi hàm để tìm kiếm dữ liệu cần thiết.
Sự tách biệt giữa chức năng xử lý với giao diện đã tạo nên sự linh hoạt cho việc
thiết kế ứng dụng.
2.3.3 Client – Server n tầng
Kiến trúc n-tầng được chia thành như sau:

-

Tầng giao diện người dùng: quản lý tương tác của người dùng với ứng dụng

-

Tầng logic trình diễn: Xác định cách thức hiển thị giao diện người dùng và các yêu
cầu của người dùng được quản lý như thế nào.
22


Báo cáo đồ án Cơ Sở Ngành Mạng
-


Tầng logic tác nghiệp: Mô hình hóa các quy tắc tác nghiệp.

-

Tầng các dịch vụ hạ tầng: Cung cấp chức năng bổ trợ cần thiết cho ứng dụng.

23


Báo cáo đồ án Cơ Sở Ngành Mạng

CHƯƠNG 2. PHÂN TÍCH THIẾT KẾ HỆ THỐNG
1. Cờ gánh
1.1.

Giới thiệu
Cờ gánh là một trò chơi chiến thuật trên bàn, dành cho hai người, có xuất xứ từ tỉnh
Quảng Nam, Việt Nam.
Một bàn cờ gánh gồm 16 quân chia đều cho mỗi bên(8 quân) và được phân biệt
nhau bằng màu sắc, hình dáng.

Hình 7. Cờ gánh

1.2.

Cách chơi
Lần lượt mỗi người được di chuyển bất kỳ một quân cờ nào của mình đến một giao
điểm lân cận của lưới vuông, theo đường nằm ngang, đường thẳng đứng hoặc
đường chéo thể hiện ở trên bàn cờ, mà chưa có quân cờ nào ở đó. Nếu quân cờ của

một người chơi nằm ở giữa (trung điểm) của hai quân cờ đối phương lân cận, thì hai
quân cờ lân cận này của đối phương bị coi là bị "gánh" và bị đổi màu (hoặc đổi đặc
điểm nhận dạng) để trở thành quân cờ của người chơi. Nếu quân cờ của người chơi
nằm xung quanh một quân cờ của đối phương, khiến cho nó không thể di chuyển,
thì quân cờ này của đối phương bị coi là bị "vây" và bị đổi màu để trở thành quân
cờ của người chơi.
Trò chơi kết thúc khi một người chơi không còn quân cờ nào. Người thắng cuộc khi
đó có 16 quân cờ.
Lưu ý :
Trong nước đi để "gánh" quân của đối phương, có thể cùng một lúc gánh được 4
quân hoặc 6 quân đối phương. Nước đi này còn được gọi là "chầu" 4 hay "chầu" 6.
Trong một số trường hợp, người chơi có thể chủ động tạo ra thế cờ cho quân đối
phương đi vào giữa để "gánh" quân mình. Mục tiêu có thể là sau đó người chơi sẽ
24


Báo cáo đồ án Cơ Sở Ngành Mạng
gánh lại quân đối phương chầu 4 hoặc chầu 6, hoặc tạo đường đi cho các nước cờ
xa hơn. Nước đi như vậy được gọi là nước "mở".
2. Phân tích yêu cầu
2.1 Yêu cầu chức năng
Xây dựng chương trình Server với nhiệm vụ:
+ Lắng nghe sự kiện kết nối từ Client
+ Lắng nghe các yêu cầu từ Client đã kết nối
+ Xử lý dữ liệu gửi lên từ Client và lưu trữ lại
+ Phản hồi các yêu cầu của Client sau khi đã xử lý
+ Từ các dữ liệu đã lưu trữ, đưa ra quyết định dừng ván cờ và xác định người chiến
thắng, trả kết quả ván cờ về cho các Client.
Xây dựng chương trình Client với nhiệm vụ:
+ Kết nối tới Server

+ Lắng nghe các sự kiện từ Server.
+ Lắng nghe các sự kiện từ người dùng
+ Từ dữ liệu thu thập được từ người dùng, tính toán và gửi kết quả lên Server
2.2 Yêu cầu giao diện
Không cần thiết phải thiết kế giao diện cho chương trình Server.
Các giao diện cần thiết kế cho chương trình Client:
+ Đăng nhập: gồm các textbox username, password, button login và register(cho
người dùng chưa có tài khoản)
+ Đăng ký: gồm các textbox username, password, confirm password, button
register, back to login.
+ Chọn phòng: gồm danh sách các phòng chơi có sẵn để người dùng lựa chọn và
button new room để người chơi tạo phòng mới.
+ Chơi game: gồm 1 hình ảnh thể hiện bàn cờ và các quân cờ, 1 khung chat lưu lại
các tin nhắn đã chat, một textbox để người dùng nhập nội dung chat, các button cầu
hoà, xin thua, rời bàn, 2 label hiển thị số quân cờ hiện có của 2 người chơi.
+ Ngoài ra còn có các thông báo được đưa ra màn hình khi có các sự kiện hoặc lỗi.
3. Thiết kế hệ thống
Để đơn giản hóa chương trình thì sẽ không sử dụng cơ sỡ dữ liệu mà dùng các biến
để lưu trữ trạng thái cũng như những dữ liệu phát sinh từ người chơi.
Các hàm quản lý kết nối từ client – server sẽ được xử lý thông qua thư viên
socket.io được xây dựng từ lớp Socket, ServerSocket trong java.
25


×