Tải bản đầy đủ (.pdf) (43 trang)

đồ án lập trì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 (1.41 MB, 43 trang )

MỤC LỤC
DANH SÁCH HÌNH VẼ .........................................................................................................iv
DANH SÁCH BẢNG BIỂU.................................................................................................... v
LỜI MỞ ĐẦU........................................................................................................................ 1
PHẦN 1: NGUYÊN LÝ HỆ ĐIỀU HÀNH ............................................................................... 2
TIÊU ĐỀ: .............................................................................................................................. 2
CHƯƠNG 1. CƠ SỞ LÝ THUYẾT ........................................................................................ 2
1.

Giới thiệu Hook ........................................................................................................ 2

2.

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

3.

Các loại Hook............................................................................................................ 3

4.

Hook Procedure........................................................................................................ 3

5.

Cài đặt hook .............................................................................................................. 4
5.1 Cài đặt một Filter Function vào chuỗi các Filter Function của một hook .......... 4
5.2 Gỡ bỏ một Filter Function ra khỏi chuỗi các Filter Function của một hook ...... 7
5.3 Gọi Filter Function kế tiếp trong chuỗi các Filter Function ................................ 7

6.



Thư viện liên kết động DLL ..................................................................................... 8
6.1 Khái niệm ................................................................................................................ 8
6.2 Cách thức hoạt động ............................................................................................. 8
6.3 Các loại liên kết động ............................................................................................ 9
6.4 Tại sao sử dụng DLL ................................................................................................. 9

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

Yêu cầu chức năng .................................................................................................... 10

2.

Yêu cầu giao diện ................................................................................................... 10

3.

Thuật toán ............................................................................................................... 10

4.

Cơ sở dữ liệu.......................................................................................................... 10

CHƯƠNG 3. TRIỂN KHAI ĐÁNH GIÁ KẾT QUẢ ............................................................... 11
1.

Triển khai ................................................................................................................ 11
1.1


Môi trường triển khai ...................................................................................... 11

1.2

Cấu trúc project ............................................................................................... 11

2.

Kết quả .................................................................................................................... 12

3.

Đánh giá kết quả..................................................................................................... 13

KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN .............................................................................. 13
1.

Những kết quả đạt được ............................................................................................ 13

2.

Những vấn đề còn tồn tại ........................................................................................... 13

3.

Hướng phát triển ...................................................................................................... 14

PHẦN 2: LẬP TRÌNH MẠNG .............................................................................................. 15
TIÊU ĐỀ: ............................................................................................................................ 15
i



CHƯƠNG 1. CƠ SỞ LÝ THUYẾT ...................................................................................... 15
1.

2.

Socket ....................................................................................................................... 15
1.1

Khái niệm và các đặc tính cơ bản ........................................................................ 15

1.2

Các constructor.................................................................................................. 15

1.3

Hàm lấy thông tin Socket .................................................................................... 16

1.4

Lớp ServerSocket ............................................................................................... 16

Mô hình Client – Server ............................................................................................ 17
2.1

Khái niệm và đặc tính cơ bản.............................................................................. 17

2.2


Cách thức hoạt động .......................................................................................... 18

2.3

Các kiến trúc Client – Server .............................................................................. 18

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

2.

Cờ gánh .................................................................................................................. 20
1.1.

Giới thiệu ......................................................................................................... 20

1.2.

Cách chơi......................................................................................................... 21

Phân tích yêu cầu ................................................................................................... 22
2.1

Yêu cầu chức năng ......................................................................................... 22

2.2

Yêu cầu giao diện ............................................................................................ 22


3.

Thiết kế hệ thống .................................................................................................... 22

4.

Xây dựng chương trình ......................................................................................... 23
4.1 Package socket.io ................................................................................................ 23
4.2

Đóng gói dữ liệu .............................................................................................. 23

4.3

Xử lý dữ liệu sau khi nhận được.................................................................... 25

4.4

Giá trị điều khiển ............................................................................................. 25

4.5

Phòng chơi ...................................................................................................... 26

4.6

Bàn cờ và quân cờ .......................................................................................... 26

4.7


Thuật toán ........................................................................................................ 26

CHƯƠNG 3. TRIỂN KHAI ĐÁNH GIÁ KẾT QUẢ ............................................................... 30
1.

Triển khai ................................................................................................................. 30
1.1.

Môi trường phát triển ứng dụng: ................................................................... 30

1.2.

Cấu trúc chương trình .................................................................................... 30

2.

Kết quả .................................................................................................................... 33

3.

Đánh giá kết quả..................................................................................................... 36

KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN .............................................................................. 36
1.

Những kết quả đạt được ............................................................................................ 36

2.

Những vấn đề còn tồn tại ........................................................................................... 36


3.

Hướng phát triển ...................................................................................................... 36

KẾT LUẬN CHUNG ............................................................................................................ 36
ii


TÀI LIỆU THAM KHẢO ...................................................................................................... 37
PHỤ LỤC ............................................................................................................................ 38

iii


DANH SÁCH HÌNH VẼ
Hình 1 Hook chain ......................................................................................................... 3
Hình 2. Cấu trúc table word ........................................................................................... 11
Hình 3. Cấu trúc project ứng dụng gõ tắt ......................................................................... 12
Hình 4. Giao diện ứng dụng gõ tắt .................................................................................. 13
Hình 5. Mô hình client - server 2 tầng ............................................................................. 19
Hình 6. Mô hình client - server 3 tầng ............................................................................. 20
Hình 7. Cờ gánh ........................................................................................................... 21
Hình 8. Định dạng dữ liệu ............................................................................................. 24
Hình 9. Cấu trúc project Game Server ............................................................................. 31
Hình 10. Cấu trúc Cờ Gánh Client .................................................................................. 32
Hình 11. Giao diện đăng nhập ........................................................................................ 33
Hình 12. Giao diện đăng kí ............................................................................................ 34
Hình 13. Màn hình chính ............................................................................................... 35
Hình 14. Giao diện bàn chơi .......................................................................................... 35

Hình 15. Giao diện chơi game ........................................................................................ 36

iv


DANH SÁCH BẢNG BIỂU
Bảng 1. Các loại hook và tầm ảnh hưởng........................................................................... 6

v


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.

1


PHẦN 1: NGUYÊN LÝ HỆ ĐIỀU HÀNH
TIÊU ĐỀ:
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.
2


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


-

WH_MSGFILTER and WH_SYSMSGFILTER

-

WH_SHELL

4. Hook Procedure
3


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.
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 của một hook
4


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


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

Value Scope


Hook procedure

WH_CALLWNDPROC

4

Thread or global

CallWndProc

WH_CALLWNDPROCRET

12

Thread or global

CallWndRetProc

WH_CBT

5

Thread or global

CBTProc

WH_DEBUG

9


Thread or global

DebugProc

WH_FOREGROUNDIDLE

11

Thread or global

ForegroundileProc

WH_GETMESSAGE

3

Thread or global

GetMsgProc

WH_JOURNALPLAYBACK 1

Global only

JournalPlayBackProc

WH_JOURNALRECORD

0


Global only

JournalRecordProc

WH_KEYBOARD

2

Thread or global

KeyboardProc

WH_KEYBOARD_LL

13

Global only

LowLevelKeyboardProc

WH_MOUSE

7

Thread or global

MouseProc

WH_MOUSE_LL


14

Global only

LowLevelMouseProc

WH_MSGFILTER

-1

Thread or global

MessageProc

WH_SHELL

10

Thread or global

ShellProc

WH_SYSMSGFILTER

6

Global only

SysMsgProc


6


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 của một
hook
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,

_In_

WPARAM wParam,

_In_

LPARAM lParam

);
Tham số:

7


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

8


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

9


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.
- 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 phím n lần
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.

10


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

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

11


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

2. Kết quả

12


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.
2. Những vấn đề còn tồn tại

13


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


14


PHẦN 2: LẬP TRÌNH MẠNG
TIÊU ĐỀ:
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
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.
15


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

16


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

17


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.
2.3 Các kiến trúc Client – Server
2.3.1 Client – Server 2 tầng

18


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.

19


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
1. Cờ gánh
1.1. Giới thiệu
20


Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×