









Preview text:
I.
Tài liệu tham kh a*o ............................................................................................................ 11 I. Ý tư*ởng
Tạo một ứng dụng web cho phép người dùng đăng nhập để xem được thông tin của người tạo nên trang
web (2 thành viên trong nhóm thực hiện đồ án) và cho phép người dùng tải các tập tin từ máy chủ của trang web về máy.
II. Các bước cài đặt ứng dụng này
Sử dụng gói MFC để tạo template code.
Các file .cpp và .h được tạo sẵn, chỉ cần viết hàm main() vào file .cpp được yêu cầu (ở đây là
Web_Server.cpp), tạo thêm file Web_Server.h để khai báo các hàm, các thư viện cần thiết. Phần này đã được viết sẵn Phần này đã được viết sẵn Cài đặt hàm main -
Tạo 2 class CSocket là client và server, CSocket server khởi tạo bằng hàm Create với port của
giao thức HTTP là port 80 được định nghĩa bằng DEFAULT_PORT ở Web_Server.h. Port 80 -
Khởi tạo 1 thread để làm việc với socket trong thread đó Khởi tạo thread -
Sử dụng vòng lặp vô tận để CSocket server luôn lắng nghe và chấp nhận tín hiệu từ CSocket
client bằng hàm Listen và Accept với số kết nối tối đa là MAXCONN được định nghĩa trong Web_Server.h. -
Khởi tạo một con trỏ client_socket kiểu SOCKET*, tách SOCKET từ CSocket client và gán vào con
trỏ client_socket bằng hàm Detach. -
Đưa con trỏ client_socket này vào hàm Receive_Send_Thread trong thread để thực hiện việc
nhận dữ liệu từ socket và gửi dữ liệu tới socket độc lập với chương trình chính. -
Vòng lặp tiếp tục lặp lại vô tận để nhận CSocket server lắng nghe và chấp nhận kết nối từ CSocket client.
Vòng lặp vô tận cho việc lắng
nghe, chấp nhận và gửi nhận tín hiệu giữa các CSocket
Để được đưa vào hàm Receive_Send_Thread con trỏ client_socket phải ép thành kiểu LPVOID, vào bên
trong hàm Receive_Send_Thread, ép kiểu con trỏ client_socket về lại kiểu SOCKET* rồi gán giá trị của nó
cho CSocket Used_ClientSocket.
Sử dụng hàm Receive để nhận dữ liệu từ Used_ClientSocket và lưu vào mảng kí tự receive_buffer với độ
dài DEFAULT_BUFFER_LENGTH, hàm Receive trả về số byte dữ liệu nhận được cho biến receive_result.
Nếu số byte nhận được lớn hơn 0, nhận dữ liệu thành công và tiến hành phản hồi; nếu số byte nhận
được bằng 0, phía client ngừng gửi dữ liệu, đóng Used_ClientSocket và kết thúc hàm; nếu số byte nhận
được khác hai trường hợp trên, quá trình nhận bị lỗi, đóng Used_ClientSocket và kết thúc hàm. Quá trình phản hồi: -
Xử lí nội dung request từ client chứa bên trong receive_buffer bằng hàm processRequest để biết
được các thông tin quan trọng như Request method (phương thức request), tài nguyên mà
client yêu cầu (trong phương thức GET), những dữ liệu mà client gửi tới (thông qua phương
thức POST) và chuẩn bị các thông tin cần thiết để tạo một response như Status-Code (mã phản
hồi), tên file tài nguyên mà client yêu cầu, loại tài nguyên mà client yêu cầu,… -
Tạo response bằng hàm createResponse, response gồm 3 phần:
+ Status-Line chứa các thông tin như HTTP version (phiên bản HTTP), Status-Code, Reason-
Pharse (mô tả về mã phản hồi)
+ Header chứa các thông tin về Connection, Content-Type, Content-Disposition, Transfer-
Encoding, Location, Conten-Length,...và một dòng trống để kết thúc phần Header.
+ Phần Body chứa nội dung cần gửi về cho client thông qua response. -
Sử dụng hàm Send để gửi response đi từ Used_ClientSocket, hàm Send trả về số byte gửi được
cho biến send_result, nếu send_result nhỏ hơn hoặc bằng 0, việc gửi response thất bại, ngược
lại, gửi response thành công. III. Chạy thư*ứng dụng -
Mở tập tin “Web_Server.exe”. Mở tập tin Web_Server.exe -
Mở trình duyệt web và truy cập vào “localhost”. Truy cập “localhost” -
Tại trang đăng nhập, nhập tên đăng nhập vào mục Username và mật khẩu vào mục Password
(mặc định là admin/admin).
Nếu tên đăng nhập và/hoặc mật khẩu không hợp lệ, sẽ phải nhập lại. Tên đăng nhập không hợp lệ
Nếu tên đăng nhập và/hoặc mật khẩu sai, trang 404 Not Found xuất hiện. Tên đăng nhập và/hoặc mật khẩu sai Trang 404 Not Found xuất hiện
Nếu tên đăng nhập và mật khẩu đúng, trang thông tin về 2 thành viên trong nhóm thực
hiện đồ án hiện ra, tại đây có nút “DOWNLOAD FILES”, bấm vào nút này để đến trang tải tập tin từ máy chủ. Thông tin của 2 thành Nhấn vào nút này để viên trong nhóm thực đến trang tải tập tin hiện -
Trang tải tập tin hiện ra với tên các tập tin có thể tải về, kích thước tập tin và các thông tin liên quan. Các tập tin có thể tải về, bấm vào tập tin muốn tải để tải về -
Bấm vào tên tập tin muốn tải, hộp thoại “Save as” xuất hiện và tên của tập tin tải về được tự
động điền vào giống như tên tập tin ở trên trang tải tập tin, bấm vào nút “Save” để tải tập tin về máy. Chọn vị trí lưu, đặt tên tập tin, nhấn “Save” để lưu Tập tin cần tải đã được lưu thành công IV. Tài liệu tham k h a* o
Tài liệu về công nghệ web cho lập trình viên:
https://developer.mozilla.org/en-US/ CAsyncSocket class:
https://docs.microsoft.com/en-us/cpp/mfc/reference/casyncsocket-class?view=msvc-160#detach Transfer-Encoding: chunked
https://en.wikipedia.org/wiki/Chunked_transfer_encoding