Tải bản đầy đủ (.docx) (43 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 (628.52 KB, 43 trang )

ĐẠ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

Đà Nẵng - 5/2017


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

MỤC LỤC


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

DANH SÁCH HÌNH VẼ

3


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

DANH SÁCH BẢNG BIỂU

4




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.
Sinh viên thực hiện
Phan Thanh An.

5


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

6


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

đ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 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

7


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

-

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

8


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

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(
_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.

9


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

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

12

Thread or
global
Thread or
global

CallWndRetProc

10


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

WH_CBT

5

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
Global only

0

Global only

WH_KEYBOARD

2

WH_KEYBOARD_LL


13

Thread or
global
Global only

WH_MOUSE

7

WH_MOUSE_LL

14

WH_MSGFILTER

-1

WH_SHELL

10

WH_SYSMSGFILTER

6

3

Thread or

global
Global only
Thread or
global
Thread or
global
Global only

CBTProc
DebugProc
ForegroundileProc
GetMsgProc
JournalPlayBackPro
c
JournalRecordProc
KeyboardProc
LowLevelKeyboardP
roc
MouseProc
LowLevelMouseProc
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
);

11


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

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,

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


12


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

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

13


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

-

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.

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.

14


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

-

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

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

15


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

16


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

2. Kết quả

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.


17


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

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

18


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
Client-Server.

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

19


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

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

20


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

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.


-

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.

21


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

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.
Ở 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.
22


Báo cáo đồ án Cơ Sở Ngành Mạ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.
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.

23


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

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.

-

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.

CHƯƠNG 2. PHÂN TÍCH THIẾT KẾ HỆ THỐNG

24


Báo cáo đồ án Cơ Sở Ngành Mạ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 ý :

25


×