Là môi trường lập trình C++ cho phép thiết kế trực quan giao diện. • Các ứng dụng được tổ chức theo dạng project, một project chứa các file khác nhau về mã chương trình, giao diện, các file header… • Có nhiều loại ứng dụng trong VC++. Chương này giới thiệu về ứng dụng MFC
LẬP TRÌNH HỆ THỐNG CHAT ĐƠN GIẢN BẰNG WINSOCK TRONG MƠI TRƯỜNG LẬP TRÌNH VISUAL C++ Bài thực hành L P TRÌNH HN THRNG N R CHAT ĐƠN GI6N B>NG > WINSOCK TRONG MÔI TRƯ NG L P TRÌNH VISUAL C++ Nội dung 4.1 Giới thiệu mơi trường lập trình Visual C++ 6.0 4.2 Lập trình Winsock VC++ 4.3 ThiGt kG ng dang m5ng MiniChat 4.4 Hiện thực chương trình MiniChatServer 4.5 HiOn th c chương trình MiniChatClient Giới thiệu mơi trường lập trình Visual C++ 6.0 (VC++) • Là mơi trường lập trình C++ cho phép thiết kế trực quan giao diện • Các ứng dụng tổ chức theo dạng project, project chứa file khác mã chương trình, giao diện, file header… • Có nhiều loại ứng dụng VC++ Chương giới thiệu ứng dụng MFC Tạo project Dùng menu File Ỉ New Hộp thoại bên xuất Ở tag projecst, chọn loại ứng dụng MFC AppWizard (exe) Ở phần location, chọn thư mục để chứa project Gõ tên project chọn OK Hiệu chỉnh thông số Bước thứ chọn loại ứng dụng, chọn dạng Dialog based hình bên Nhấn button Next để tiếp tục Hiệu chỉnh thông số Bước 2, chọn đặc tính ứng dụng hình + Phải chọn checkbox Windows Sockets Nhấn button Next để tiếp tục Hiệu chỉnh thông số Bước 3, chọn chức hỗ trợ hình vẽ Nhấn button Next để tiếp tục Hiệu chỉnh thông số Bước 4: xác nhận thơng số chọn Có thể qua lại bước trước để hiệu chỉnh button Back Chọn button Finish để kết thúc Hiệu chỉnh thông số Bước cuối cùng: xác nhận chọn OK để bắt đầu lập trình Thiết kế sơ đồ chức ứng dụng MiniChatServer • Xử lý liệu PRIVATE*: Phân tích lấy liệu Dữ liệu định dạng S Gởi thông báo lỗi –100: Bad request cho client Đ Lấy thông tin nicknamesender Đã có danh sách? Lấy thơng tin nicknamere ciever Đã có danh sách? Đ Đ S Gởi thơng báo lỗi –101: Not login cho client Gởi thông báo lỗi –103: Nickname not exist cho client S Tìm địa socket user danh sách gởi thông tin PRIVATE:nicknamesender:message* cho client Gởi thông tin +OK cho client gởi tin Thiết kế sơ đồ chức ứng dụng MiniChatServer • Xử lý liệu QUIT*: Phân tích lấy liệu Dữ liệu định dạng S Gởi thông báo lỗi –100: Bad request cho client Đ Tìm địa socket có danh sách user? S Gởi thông báo lỗi –101: Not login cho client Gởi thơng tin +OK cho client Xố thơng tin user khỏi danh sách user Gởi lệnh LIST[:nickname]* cho tất client có danh sách user Thiết kế sơ đồ chức ứng dụng MiniChatClient • Chương trình client tạo socket, lấy thơng tin từ giao diện người sử dụng để kết nối đến server • Nếu kết nối thành cơng, lấy thơng tin nickname để gởi liệu LOGIN:nickname* đến server chờ nhận liệu Dữ liệu có hai dạng: – bắt đầu ký hiệu ‘-’ có nghĩa bị lỗi, phân tích lỗi tương ứng để thơng báo cho user – Nếu LIST* có nghĩa đăng nhập thành cơng, phân tích danh sách nickname để hiển thị cho user Thiết kế sơ đồ chức ứng dụng MiniChatClient • User gởi message vào chat room, có hai dạng: – Chỉ gởi cho user: tạo lệnh PRIVATE* gởi cho server Chờ nhận liệu về: • +OK: tiếp tục q trình khác • -xxx: lỗi giao thức, phân tích lỗi thơng báo – Gởi cho tồn chat room: tạo lệnh PUBLIC* gởi cho server Chờ nhận liệu về: • +OK: tiếp tục q trình khác • -xxx: lỗi giao thức, phân tích lỗi thơng báo Thiết kế sơ đồ chức ứng dụng MiniChatClient • User khỏi chat room tắt chương trình – Gởi lệnh QUIT* cho server chờ nhận liệu về: • +OK: tiếp tục q trình khác • -xxx: lỗi giao thức, phân tích lỗi thơng báo • Nhận liệu từ server: phân tích liệu thuộc dạng: USERL*, USERQ*, PRIVATE*, PUBLIC*, khơng thuộc dạng thơng báo lỗi Đối với dạng liệu sử lý slide kế Thiết kế sơ đồ chức ứng dụng MiniChatClient • Nếu lệnh USERL*: – Phân tích lấy nickname – Thêm nickname vào danh sách user • Nếu lệnh USERQ*: – Phân tích lấy nickname – Xoá nickname khỏi danh sách user, có lỗi báo lỗi cho user • Nếu lệnh PRIVATE* PUBLIC* – Hiển thị thông tin cho user Hiện thực chương trình Editbox, MiniChatServer ID=IDD_EDIT_PORT, Thiết kế giao diện hình bên đặt biến tương ứng cho phần tử giao diện biến tương ứng: int m_port; StaticText, ID=IDD_STATIC_STATUS , caption =‘’, biến tương ứng CString m_status; Edit box, ID=IDD_EDIT_MESSAGE, Multiline, scroll, biến tương ứng: CString m_message; Listbox, ID=IDD_LIST_USER, Multiline, scroll, biến tương ứng: CListBox m_users; Hiện thực chương trình MiniChatServer • Định nghĩa kiểu liệu record để lưu danh sách user (đầu file C*Dlg.h): typedef struct T_UserRecord { char name[20]; SOCKET socket; int state; struct T_UserRecord* next; } T_UserRecord; • Khai báo biến: (dùng chức Add Member Variable) SOCKET ServerSocket; char temp_message[128]; T_UserRecord *UserRecordList; T_UserRecord *tempUserRecord; Hiện thực chương trình MiniChatServer • Khai báo số (file Resource.h) – – – – – – #define MSG_LENGTH #define WSA_ACCEPT #define WSA_RDCLOSE #define CONNECTED #define LOGIN #define CHAT 256 1006 1007 2000 2001 2002 • Lập trình theo bước sau: – Tạo hàm xử lý kiện người dùng click chuột vào Button Listen, hàm OnButtonListen(): gọi lệnh socket, bind, listen, WSASyncSelect Hiện thực chương trình MiniChatServer • Trình tự: – Tạo hàm WindowProc() viết mã lệnh: • Tùy theo loại message gọi hàm tương ứng để xử lý (hai loại message định nghĩa WSA_ACCEPT, WSA_RDCLOSE) – Định nghĩa viết mã lệnh hàm OnAccept(…): xử lý kiện FD_ACCEPT, message WSA_ACCEPT có yêu cầu kết nối – Định nghĩa viết mã lệnh hàm Process(…): xử lý kiện FD_READ, message WSA_RDCLOSE có liệu gởi đến từ client Hiện thực chương trình MiniChatServer • Trình tự: – Trong hàm Process(): phân tích định dạng liệu đến xử lý tương ứng: • • • • LOGIN*: hàm Login(…) PUBLIC*: hàm SendPublic(…) PRIVATE*: hàm SendPrivate(…) QUIT*: hàm Logout(…) – Định nghĩa viết mã lệnh cho hàm theo sơ đồ khối thiết kế Hiện thực chương trình MiniChatClient Thiết kế giao diện chương trình client hình vẽ Static Text, CString m_status Editbox, Editbox, int port CString m_host Editbox, CString m_nickname Editbox, CString m_message Listbox, CListBox m_list_members Editbox, CString user Editbox, CString m_data Hiện thực chương trình MiniChatClient • Khai báo biến: (dùng chức Add Member Variable) SOCKET ClientSocket; char temp_message[128]; int chat_status; CString data; • Khai báo số (file Resource.h) – – – – – #define NOTLOGIN #define LOGIN #define QUIT #define CHAT #define WSA_RDREAD 2000 2001 2002 2003 3000 Hiện thực chương trình MiniChatClient • Lập trình theo bước sau: – Tạo hàm xử lý kiện người dùng click chuột vào Button Login, hàm OnButtonLogin(): gọi lệnh socket, connect, WSASyncSelect để chờ nhận kiện mạng – Tạo hàm WindowProc() viết mã lệnh: • Chương trình client có message (WSA_RDREAD) cho hai kiện FR_READ FD_CLOSE, với kiện ta thực lệnh gọi hàm tương ứng – Định nghĩa viết mã lệnh hàm Process(…): xử lý kiện FD_READ, message WSA_RDREAD có liệu từ server gởi đến Hiện thực chương trình MiniChatClient • Trình tự: – Định nghĩa viết mã lệnh hàm Login, ResponseLogin, Send, Communicate, DisplayUserList – Tạo hàm xử lý kiện :OnSelchangeListMember, OnButtonSend, OnButtonLogout ... thực hành L P TRÌNH HN THRNG N R CHAT ĐƠN GI6N B>NG > WINSOCK TRONG MÔI TRƯ NG L P TRÌNH VISUAL C++ Nội dung 4.1 Giới thiệu mơi trường lập trình Visual C++ 6.0 4.2 Lập trình Winsock VC++ 4.3 ThiGt... dang m5ng MiniChat 4.4 Hiện thực chương trình MiniChatServer 4.5 HiOn th c chương trình MiniChatClient Giới thiệu mơi trường lập trình Visual C++ 6.0 (VC++) • Là mơi trường lập trình C++ cho phép... ng dang m5ng MiniChat • Ứng dụng MiniChat có hai chương trình MiniChatServer MiniChatClient • Trong hệ thống, có chương trình server nhiều chương trình client chạy • Chương trình client gởi liệu