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 HelpF1 cho ứng dụng - Tạ
Trang 1KHOA CÔNG NGHỆ THÔNG TIN
Tel (84-236) 736 949, Fax (84-236) 842 771Website: itf.ud.edu.vn, E-mail: cntt@edu.ud.vn
BÁO CÁO ĐỒ ÁN
CƠ SỞ NGÀNH MẠNG
Đà Nẵng - 5/2017
Trang 2MỤ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 ĐỀ: XÂY DỰNG ỨNG DỤNG GÕ TẮT 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 4
5.2 Gỡ bỏ một Filter Function ra khỏi chuỗi các Filter Function 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
Trang 33 Hướng phát triển 14
PHẦN 2: LẬP TRÌNH MẠNG 15
TIÊU ĐỀ: XÂY DỰNG GAME CỜ GÁNH 15
CHƯƠNG 1 CƠ SỞ LÝ THUYẾT 15
1 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
2 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 Cờ gánh 20
1.1 Giới thiệu 21
1.2 Cách chơi 21
2 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 23
4 Xây dựng chương trình 23
4.1 Package socket.io 23
4.2 Đóng gói dữ liệu 24
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Ả 31
1 Triển khai 31
1.1 Môi trường phát triển ứng dụng: 31
1.2 Cấu trúc chương trình 31
2 Kết quả 33
Trang 4KẾ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
TÀI LIỆU THAM KHẢO 37
Trang 5DANH 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
Trang 6DANH SÁCH BẢNG BIỂU
Bảng 1 Các loại hook và tầm ảnh hưởng 6
Trang 7Cũ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êncứ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ìnhtrong 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ếusó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
Trang 8PHẦ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 chotừ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, hookprocedure 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, hookprocedure 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ấtcủ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
Trang 9điều khiển cho hook procedure kế tiếp hay không, hệ thống vẫn sẽ tự động làmviệ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ệpsâ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 địnhhướ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 ngaykhi 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à Hookprocedure can thiệp vào Danh sách dưới đây liệt kê các loại hook kèm với linkdẫn đến tham khảo từ MSDN:
- WH_CALLWNDPROC and WH_CALLWNDPROCRET
Trang 10- 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àykhi 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 hookprocedure khác nhau nhưng đều có cùng tham số như cú pháp bên dưới Với mỗihook 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 hookprocedures vào hook chain
Một hook procedures có cú pháp như sau:
LRESULT CALLBACK HookProc(
Ý 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ủahook 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ợpnhữ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ầntuân thủ: khi Window truyền cho hàm giá trị hook code âm, Hook procedurekhông được xử lý sự kiện mà phải gọi hàm CallNextHookEx với chính nhữngtham 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 proceduretrong quá trình xử lý sự kiện Các giá trị này sẽ có ý nghĩa khác nhau tuỳ thuộcvào từng loại hook
Trang 11Ví 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ácthô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ácthô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 debugnhững thủ tục hook khác
• WH_FOREGROUNDIDLE : đặt một thủ tục hook sẽ được gọikhi 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ữngthông điệp được ghi trước đó bởi thủ tục hookWH_JOURNALRECORD
•WH_JOURNALRECORD : đặt một thủ tục hook ghi nhữngthô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
Trang 12• 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ệpchuộ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 đượckết sinh như là kết quả của một sự kiện đầu vào ở trong dialogbox, 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 procedurechỉ ả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 ảnhhưở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 threadxá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ủabất kỳ thread nào đang tồn tại trên HĐH Có thể sử dụng hàmGetCurrentThreadId để lấy được handle của thread muốn cài đặthook
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ùngtầm ảnh hưởng của nó:
Bảng 1 Các loại hook và tầm ảnh hưởng
Trang 13Vớ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 Trongtrường hợp này bạn có thể dùng hàm GetLastErrorđể lấy thôngtin 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ệnviệc này Khai báo của nó như sau:
BOOL WINAPI UnhookWindowsHookEx(
_In_ HHOOK hhk
);
Trang 14Tham số: hhook chỉ ra hàm hook được dỡ bỏ Đây là giá trị được trả vể bởihà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ợpvớ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 hookprocedure, và kể từ thời điểm này, trách nhiệm Windows không còn nữa Hookprocedure 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ũngcà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 chohook procedure của ứng dụng này tham gia xử lý sự kiện, sẽ có vấn đề rắc rốixả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ươngtrì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
- 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 trongcùng một chuỗi Lúc này, nếu loại hook chúng ta đang cài đặtcho 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àmCallNextHookEx
Trang 156 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ùngmột lúc
Bằng cách sử dụng một DLL, chương trình có thể được mô-đun hoá thànhnhiề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ếumô-đ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ìnhbả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ệubên trong tập tin và cung cấp thông tin "This program uses the following list offunctions from the DLL file library.dll" (chương trình này sử dụng danh sách cácchứ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ìmthấ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ậptin 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 minhhay 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 đượcexport 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àmDLL 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
Trang 16- Liên kết tường minh (Explicit Linking): Liên kết tường minhhay còn gọi là liên kết ở thời điểm chạy (Run-time DynamicLinking): sử dụng các con trỏ hàm ở thời điểm chạy chươngtrì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 Saukhi 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àomộ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ể ảnhhưởng đáng kể hiệu suất của không chỉ chương trình đang chạy trên nềncò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ềunà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ìnhmô-đun là một chương trình kế toán có nhiều mô-đun có thể được tự độngtả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ươngtrì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ườngxuyên hơn có thể xảy ra khi bạn sử dụng một DLL bên thứ ba đượcthườ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.
Trang 17- 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ếttắ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
- 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
Trang 18CHƯƠ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
Trang 19Tuy 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 đổicử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
Trang 20Xâ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ồiquay 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
Trang 21PHẦ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ínhvới nhau Nó là điểm giao tiếp (endpoint) khi thực hiện quá trình liên kết truyềnnhậ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 đườngmạng, tạo một output stream đính kèm với socket, và máy tính nhận thì cần inputstream 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)
- 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
Trang 22Constructor 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ốitớ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ôngthườ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ộtsocket gắn kết với nó
public InputStream getInputStream() throws IOException: Trả về một luồngnhập để đọc dữ liệu từ một socket vào chương trình
public OutputStream getOutputStream() throws IOException: Trả về mộtluồ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
Trang 23Lớp SeverSocket thì được sử dụng để đại diện cho Sever trong việc giao tiếpgiữ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ắngnghe 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
- 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 khingắ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ộtdạ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êucầ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àinguyê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
Trang 24Mộ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à giaothứ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 ngaykhi 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 thicủ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 thicủ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 theohay không