Bài giảng Lập trình mạng - Chương 2: Viết hệ thống MiniChatter bằng VC++ và dùng kỹ thuật xử lý sự kiện

pdf 50 trang ngocly 970
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình mạng - Chương 2: Viết hệ thống MiniChatter bằng VC++ và dùng kỹ thuật xử lý sự kiện", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfbai_giang_lap_trinh_mang_chuong_2_viet_he_thong_minichatter.pdf

Nội dung text: Bài giảng Lập trình mạng - Chương 2: Viết hệ thống MiniChatter bằng VC++ và dùng kỹ thuật xử lý sự kiện

  1. MÔN LẬP TRÌNH MẠNG Chương 2 Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện 2.1 Xây dựng module client MiniChatter 2.2 Xây dựng module server MiniChatter Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 26
  2. 2.1 Xây dựng module client MiniChatter Chúng ta sẽ thiết kế giao diện cho Form Cửa sổ phục vụ lệnh Connect : ứng dụng MiniChatClient như sau : Cửa sổ phục vụ lệnh Login : Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 27
  3. Xây dựng module client MiniChatter 1. Chạy Visual C++ 6.0 từ Windows (thí dụ chọn mục Start.Programs. Microsoft Visual Studio 6.0/Microsoft Visual C++ 6.0). Màn hình của VC++ ₫ược hiển thị như sau : Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 28
  4. Xây dựng module client MiniChatter 2. Có nhiều cửa sổ làm việc khác nhau, ta có thể bật/tắt từng cử a sổ theo nhu cầu từng thời ₫iểm. Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 29
  5. Xây dựng module client MiniChatter 3. Bước 1 : Dùng AppWizard ₫ể tạo project. Chọn menu File.New , cửa sổ bên ₫ược hiển thị. Chọn tab Projects, chọn mục MFC AppWizard (exe), chọn thư mục chứa project chương trình cần tạo ở mục "Location". Nhập tên project (MiniChatClient) vào textbox "Project Name". Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 30
  6. Xây dựng module client MiniChatter 4. Chọn button Ok, cửa sổ sau ₫ược hiển thị ₫ể bạn chọn style cửa sổ làm việc : Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 31
  7. Xây dựng module client MiniChatter 5. Thí dụ chương trình của ta dùng cửa sổ dạng hộp thoại, chọn mục "Dialog based " rồi chọn button Next, bạn sẽ ₫ược cửa sổ sau : Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 32
  8. Xây dựng module client MiniChatter 6. Chọn mục "Windows Sockets", hiệu chỉnh lại Title của dialog box, rồi chọn button Next, bạn sẽ ₫ược cửa sổ sau: Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 33
  9. Xây dựng module client MiniChatter 7. Chọn mục "As a statically linked library" hay "As a shared DLL" tùy yêu cầu cần liên kết tĩnh hay ₫ộng ứng dụng với thư viện MFC, rồi chọn button Next, bạn sẽ ₫ược cửa sổ sau : Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 34
  10. Xây dựng module client MiniChatter 8. Chọn button Finish, bạn sẽ ₫ược cửa sổ sau : Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 35
  11. Xây dựng module client MiniChatter 9. Chọn button Ok, màn hình cho chương trình sẽ ₫ược hiển thị như sau : Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 36
  12. Xây dựng module client MiniChatter 10. Bước 2 : Thiết kế trực quan các phần tử giao diện. Bắt ₫ầu thiết kế giao diện chương trình, dùng các control ₫ịnh sẵn trong cửa sổ Control. Để xóa 1 control, dùng mouse chọn nó rồi ấn button "Cut". Để thêm 1 control, dùng mouse drag nó từ cửa sổ Control vào vị trí trong dialog box. Để xem hay hiệu chỉnh các thuộc tính cúa một control, dời mouse tới nó rồi ấn phải chuột, chọn mục Properties ₫ể hiển thị cửa sổ thuộc tính. Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 37
  13. Xây dựng module client MiniChatter 11. Dùng chuột drag các ₫ối tượng (control) từ cửa sổ Control và ₫ặt ở vị trí mong muốn trong dialogbox : Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 38
  14. Xây dựng module client MiniChatter 12. Để các phần tử trong DialogBox dùng font chữ xác ₫ịnh (tiếng Việt), chọn dialogbox rồi ấn phải chuột. Cửa sổ thuộc tính sẽ ₫ược hiển thị : Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 39
  15. Xây dựng module client MiniChatter 13. Bước 3: Hiệu chỉnh các thuộc tính các phần tử giao diện (nhất là ID, caption). Cụ thể như sau : - Button "Connect" với tên IDC_CONNECT, "Group" với tên IDC_GROUPREQ, "Login" với tên IDC_LOGIN - Button "User" với tên IDC_USERREQ, Button "Send" với tên IDC_SENDMSG, "Logout" với tên IDC_LOGOUT - Textbox "Thông báo cần gởi" với tên IDC_MESG, Listbox "Danh sách nhóm" với tên IDC_GROUPLIST, - Listbox "Danh sách user trong nhóm" tên IDC_USERLIST, Listbox "Nội dung trao ₫ổi" tên IDC_CONTENT. Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 40
  16. Xây dựng module client MiniChatter Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 41
  17. Xây dựng module client MiniChatter 14. Bước 4: Kết hợp biến và hàm xử lý biến cố với các phần tử giao diện :Tạo hàm xử lý biến cố cho từng button bằng cách ₫ưa cursor về button, ấn phải chuột, chọn mục Event trong cửa sổ Propeties : Cửa sổ sau sẽ xuất hiện : Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 42
  18. Xây dựng module client MiniChatter 15. Phương pháp chính quy ₫ể khai báo biến và hàm xử lý biến cố với các phần tử giao diện là dùng menu View.ClassWizard, cửa sổ ClassWizard sẽ xuất hiện, trang Message Maps cho phép khai báo các hàm xử lý biến cố. Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 43
  19. Xây dựng module client MiniChatter 16. Để tạo các biến dữ liệu kết hợp với các phần tử giao diện, chọn Project, class chứa biến, trang Member Variables, sau ₫ó chọn từng ID phần tử rồi ấn button "Add Variable", cửa sổ sau sẽ xuất hiện : Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 44
  20. Xây dựng module client MiniChatter 17. Kết quả sau khi tạo 4 biến kết hợp với 4 phần tử giao diện : Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 45
  21. Xây dựng module client MiniChatter 18. Chọn menu Insert.Resource ₫ể tạo tuần tự các hộp thoại nhập liệu sau : Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 46
  22. Xây dựng module client MiniChatter 19. Khuôn dạng mẫu của 2 hộp thoại nhập liệu : Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 47
  23. Xây dựng module client MiniChatter 20. Bắt ₫ầu viết code cho chương trình : -Phần khởi ₫ộng ở hàm OnInitDialog nếu cần. - Các hàm xứ lý biến cố : OnConnect, OnGroupreq, OnLogin, OnUserreq, OnSend, OnLogout, Windowproc 21. Code cho hàm OnConnect() : void CMiniChatClientDlg::OnConnect() { // TODO: Add your control notification handler code here CConnectDlg condlg; if (condlg.DoModal() != IDOK) return; // Tao socket moi, neu that bai bao sai sock=socket(AF_INET,SOCK_STREAM,0); if(sock==INVALID_SOCKET) { MessageBox("Khong tao duoc socket"); return; } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 48
  24. Xây dựng module client MiniChatter // thiet lap dia chi diem dau mut ben server SOCKADDR_IN ser_addr; ser_addr.sin_family=AF_INET; ser_addr.sin_port=condlg.m_port; if ('0' h_addr,phe- >h_length); } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 49
  25. Xây dựng module client MiniChatter // Yeu cau noi ket toi server if(connect(sock,(LPSOCKADDR)&ser_addr,sizeof(ser_addr))==SOCKET_ ERROR) { MessageBox("Khong ket noi duoc"); return; } m_content.AddString("I: Da ket noi thanh cong. Bat dau noi chuyen."); // Khai bao nhan du lieu bat dong bo + dong cau noi bat dong bo if (WSAAsyncSelect(sock, m_hWnd, WSA_RDCLOSE, FD_READ | FD_CLOSE) > 0) { MessageBox("Error on WSAAsyncSelect()"); closesocket(sock); } } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 50
  26. Xây dựng module client MiniChatter void CMiniChatClientDlg::OnGroupreq() { CString mesg; mesg = _T("GLIST "); if (send(sock,mesg,strlen(mesg),0) <0) { MessageBox("Khong goi duoc lenh GLIST"); return; } else fstat = FSGLIST; } void CMiniChatClientDlg::OnLogin() { CString mesg; char gname[50]; int i = m_grouplist.GetCurSel(); m_grouplist.GetText(i,gname); CLoginDialog condlg(gname); if (condlg.DoModal() != IDOK) return; mesg = _T("LOGIN ")+condlg.m_groupname + _T(",")+condlg.m_username; if (send(sock,mesg,strlen(mesg),0) <0) { MessageBox("Khong goi duoc lenh LOGIN"); return; } else fstat = FSLOGIN; } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 51
  27. Xây dựng module client MiniChatter void CMiniChatClientDlg::OnUserreq() { // TODO: Add your control notification handler code here CString mesg; mesg = _T("ULIST "); if (send(sock,mesg,strlen(mesg),0) <0) { MessageBox("Khong goi duoc lenh ULIST"); return; } else fstat = FSULIST; } void CMiniChatClientDlg::OnSendmsg() { // TODO: Add your control notification handler code here UpdateData(TRUE); if (m_mesg != "") if (send(sock,m_mesg,strlen(m_mesg),0) <0) { MessageBox("Khong goi duoc lenh SENDMESG"); return; } else fstat = FSMESG; UpdateData(FALSE); } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 52
  28. Xây dựng module client MiniChatter void CMiniChatClientDlg::OnLogout() { CString mesg; mesg = _T("LOGOU "); if (send(sock,mesg,strlen(mesg),0) <0) { MessageBox("Khong goi duoc lenh LOGOUT"); } else fstat = FSMESG; m_content.ResetContent(); } LRESULT CMiniChatClientDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WSA_RDCLOSE : if (WSAGETSELECTEVENT(lParam) == FD_READ) { Reply_Process(wParam); } else { CloseSock(wParam); } return 1; } return CDialog::WindowProc(message, wParam, lParam); } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 53
  29. Xây dựng module client MiniChatter void CMiniChatClientDlg::Reply_Process(SOCKET sock) { int status; char mesg[MSG_LENGTH]; status = recv(sock, mesg, MSG_LENGTH, 0); if (status==0) return; mesg[status] = 0; switch (fstat) { case FSLOGIN : Do_login(mesg); break; case FSLOGOUT: // logout Do_logout(mesg); break; case FSMESG : // group list Do_receive(mesg); break; case FSGLIST: // user list Do_glist(mesg); break; case FSULIST: // broadcast message Do_ulist(mesg); } fstat = FSMESG; } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 54
  30. Xây dựng module client MiniChatter void CMiniChatClientDlg::Reply_Process(SOCKET sock) { int status; char mesg[MSG_LENGTH]; status = recv(sock, mesg, MSG_LENGTH, 0); if (status==0) return; mesg[status] = 0; switch (fstat) { case FSLOGIN : Do_login(mesg); break; case FSLOGOUT: // logout Do_logout(mesg); break; case FSMESG : // group list Do_receive(mesg); break; case FSGLIST: // user list Do_glist(mesg); break; case FSULIST: // broadcast message Do_ulist(mesg); } fstat = FSMESG; } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 55
  31. Xây dựng module client MiniChatter 22. Dịch, chạy và kiểm thử từng chức năng của ứng dụng. Khó khăn của việc kiểm thử module client (hay module server) là cần phải có ₫ối tác chạy ₫ồng thời với mình. Do ₫ó, chúng ta sẽ chạy một instance VC++ 6.0 khác ₫ể tạo và quản lý module MiniChatter Server. Các slide còn lại sẽ miêu tả thông tin v ề qui trình xây dựng module server. Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 56
  32. 2.2 Xây dựng module Server MiniChatter 1. Chạy một instance VC++ 6.0 khác, tạo và quản lý module MiniChatter Server. Thiết kế form giao diện của server như sau : Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 57
  33. Xây dựng module Server MiniChatter //Code cua MiniChatServer void CMiniChatServerDlg::OnHide() { // TODO: Add your control notification handler code here ShowWindow(SW_HIDE); } void CMiniChatServerDlg::OnCancel() { // TODO: Add extra cleanup here Shell_NotifyIcon(NIM_DELETE, &tnd); CDialog::OnCancel(); } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 58
  34. Xây dựng module Server MiniChatter BOOL CMiniChatServerDlg::OnCommand(WPARAM wParam, LPARAM lParam) { // TODO: Add your specialized code here and/or call the base class switch (wParam) { case SC_CLOSE : Shell_NotifyIcon(NIM_DELETE, &tnd); return CDialog::OnCommand(WM_CLOSE,lParam); break; case IDM_ABOUTBOX : CAboutDlg dlgAbout; dlgAbout.DoModal(); break; } return CDialog::OnCommand(wParam, lParam); } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 59
  35. Xây dựng module Server MiniChatter BOOL CMiniChatServerDlg::OnInitDialog() { // // TODO: Add extra initialization here // Init group list sock_no_user = 0; //Đọc danh sách nhóm cần quản lý từ database ReadDisplayGroups(); // Tao socket moi, neu that bai bao sai ser_sock=socket(AF_INET,SOCK_STREAM,0); if(ser_sock==INVALID_SOCKET) { MessageBox("Khong tao duoc socket"); return TRUE; } // thiet lap dia chi diem dau mut va bind no voi socket SOCKADDR_IN local_addr; local_addr.sin_family=AF_INET; local_addr.sin_port=256; local_addr.sin_addr.s_addr=INADDR_ANY; if(bind(ser_sock,(LPSOCKADDR)&local_addr,sizeof(local_addr))==SOCKET_ERROR) { MessageBox("Khong bind socket duoc"); return TRUE; } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 60
  36. Xây dựng module Server MiniChatter // Khai bao so yeu cau ket noi dong thoi if(listen(ser_sock,SOMAXCONN)==SOCKET_ERROR) { MessageBox("Khong listen duoc"); return TRUE; } // Khai bao nhan du lieu bat dong bo + dong cau noi bat dong bo if (WSAAsyncSelect(ser_sock, m_hWnd, WSA_ACCEPT, FD_ACCEPT) > 0) { MessageBox("Error on WSAAsyncSelect()"); closesocket(ser_sock); } // Display cac nhom for (i=0; i< groupcnt; i++) m_groupbox.AddString(m_grouplist[i].name); // Add to System tray tnd.cbSize = sizeof(NOTIFYICONDATA); tnd.hWnd = m_hWnd; tnd.uID = 3200; tnd.hIcon = m_hIcon; tnd.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP; tnd.uCallbackMessage = MYWM_NOTIFYICON; strcpy(tnd.szTip,"MiniChatServer"); Shell_NotifyIcon(NIM_ADD, &tnd); // ShowWindow(SW_HIDE); return TRUE; // return TRUE unless you set the focus to a control } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 61
  37. Xây dựng module Server MiniChatter void CMiniChatServerDlg::ReadDisplayGroups(){ _ConnectionPtr Con; _RecordsetPtr Rs; ::CoInitialize(NULL); if (Rs.CreateInstance (__uuidof(Recordset))!= S_OK) { MessageBox("Khong khoi dong duoc Recordset"); return; } Rs->Open ("Select * from GroupList", _bstr_t("DSN=GroupList;UID=;PWD=;" ), adOpenForwardOnly, adLockReadOnly, adCmdUnknown); VARIANT vGName; CString m_GName; groupcnt = 0; while (VARIANT_FALSE == Rs->GetadoEOF()) { groupcnt++; Rs->MoveNext(); } m_grouplist = (T_GroupList*)malloc(groupcnt*sizeof(T_GroupList)); Rs->MoveFirst(); int i = 0; while (VARIANT_FALSE == Rs->GetadoEOF()) { vGName = Rs->Fields->GetItem(_variant_t((long)1))->Value; m_GName = vGName.bstrVal; Rs->MoveNext(); strcpy(m_grouplist[i].name,m_GName); m_grouplist[i++].userlist = 0; } Rs->Close(); } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 62
  38. Xây dựng module Server MiniChatter void CMiniChatServerDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else CDialog::OnSysCommand(nID, lParam); } // void CMiniChatServerDlg::HandlePopupMenu (void) { HMENU hMenu; POINT point; int ketqua; GetCursorPos (&point); // Get the menu for the windows hMenu = ::GetSystemMenu (m_hWnd,FALSE); if (!hMenu) return; //SetForegroundWindow (); ketqua = TrackPopupMenu (hMenu, TPM_RIGHTBUTTON, point.x, point.y, 0, m_hWnd, NULL); // This is required when using a notify icon see KB article // PRB: Menus for Notification Icons Don't Work Correctly PostMessage (WM_USER, 0, 0); } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 63
  39. Xây dựng module Server MiniChatter LRESULT CMiniChatServerDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WSA_ACCEPT : OnAccept(); return 1; case WSA_RDCLOSE : if (WSAGETSELECTEVENT(lParam) == FD_READ) Read_Process(wParam); else CloseSock(wParam); return 1; case MYWM_NOTIFYICON : switch (lParam) { case WM_RBUTTONDOWN: // Handle popup here HandlePopupMenu (); return TRUE; case WM_LBUTTONDOWN:{ // Diplay the dialog box on Left mouse click ShowWindow (SW_RESTORE); SetForegroundWindow (); return TRUE; } // lParam switch } return CDialog::WindowProc(message, wParam, lParam); } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 64
  40. Xây dựng module Server MiniChatter // Accept 1 yeu cau noi ket void CMiniChatServerDlg::OnAccept(void) { SOCKADDR_IN remote_addr; SOCKET sock; // Cho ket noi int len=sizeof(remote_addr); sock=accept(ser_sock,(LPSOCKADDR)&remote_addr,&len); if(sock==INVALID_SOCKET) { MessageBox("Khong accept duoc"); return; } T_UserRec *puser = new(T_UserRec); puser->sock = sock; puser->next = sock_no_user; sock_no_user = puser; // Khai bao nhan du lieu bat dong bo + dong cau noi bat dong bo if (WSAAsyncSelect(sock, m_hWnd, WSA_RDCLOSE, FD_READ|FD_CLOSE) > 0) { MessageBox("Error on WSAAsyncSelect()"); closesocket(sock); } // Goi reply ban dau ve client if (send(sock,startmesg,strlen(startmesg),0) <0) MessageBox("Khong goi duoc du lieu"); } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 65
  41. Xây dựng module Server MiniChatter // Doc vao request va xu ly void CMiniChatServerDlg::Read_Process(SOCKET sock) { int status; char mesg[MSG_LENGTH]; status = recv(sock, mesg, MSG_LENGTH, 0); if (status==0) return; mesg[status] = 0; if (strncmp(mesg,"LOGIN",5)==0) { // login Do_login(sock,mesg); } else if (strncmp(mesg,"LOGOU",5)==0) { // logout Do_logout(sock); } else if (strncmp(mesg,"GLIST",5)==0) { // group list Do_glist(sock); } else if (strncmp(mesg,"ULIST",5)==0) { // user list Do_ulist(sock); } else { // broadcast message Do_broadcastMesg(sock,mesg); } } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 66
  42. Xây dựng module Server MiniChatter void CMiniChatServerDlg::Do_glist(SOCKET sock) { char mesg[1024]; char *ps; int i; wsprintf(mesg,"1 %s",m_grouplist[0].name); ps = &mesg[strlen(mesg)]; for (i=1;i sock == sock) { *uname = pu->name; return i; } pu = pu->next; } } return -1; } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 67
  43. Xây dựng module Server MiniChatter void CMiniChatServerDlg::Do_ulist(SOCKET sock) { char mesg[1024]; char *ps; int i = Findgroup(sock,&ps); if (i name); ps = &mesg[strlen(mesg)]; pu = pu->next; while (pu) { wsprintf(ps,",%s",pu->name); ps += strlen(ps); pu = pu->next; } } if (send(sock,mesg,strlen(mesg),0) <0) { MessageBox("Khong goi duoc du lieu ulist"); } } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 68
  44. Xây dựng module Server MiniChatter void CMiniChatServerDlg::Do_broadcastMesg(SOCKET sock, char *mesg) { char *ps; int i = Findgroup(sock,&ps); if (i sock,bmesg,strlen(bmesg),0); pu = pu->next; } } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 69
  45. Xây dựng module Server MiniChatter // Dong cau noi tuong ung void CMiniChatServerDlg::CloseSock(SOCKET sock) { char *ps; int i = Findgroup(sock,&ps); T_UserRec *pu, *pup; if (i >= 0) { pu = m_grouplist[i].userlist; while (pu && pu->sock != sock) pup = pu; pu = pu->next; if (pu==m_grouplist[i].userlist) m_grouplist[i].userlist = pu->next; else pup->next = pu->next; delete(pu); } else { pu = sock_no_user; while (pu && pu->sock != sock) pup = pu; pu = pu->next; if (pu==sock_no_user) sock_no_user = pu->next; else pup->next = pu->next; delete(pu); } closesocket(sock); } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 70
  46. Xây dựng module Server MiniChatter void CMiniChatServerDlg::Do_login(SOCKET sock, char *mesg) { T_UserRec *pup,*pu; char gname[80], uname[80]; int i; if (mesg[6] == '0') goto errordisp; // tim ten group i = 0; mesg += 6; do gname[i++] = *mesg++; while (*mesg && *mesg!=','); gname[i] = 0; if (*mesg++==0) goto errordisp; // tim ten user i = 0; do uname[i++] = *mesg++; while (*mesg && *mesg!=','); uname[i] = 0; // tim group tuong ung for (i=0; i groupcnt) goto errordisp; Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 71
  47. Xây dựng module Server MiniChatter // tim sokcet trong danh sach chua co user pup = pu = sock_no_user; while (pu && pu->sock != sock) pup = pu; pu = pu->next; if (pu) { if (pu == sock_no_user) sock_no_user = pu->next; else pup->next = pu->next; pu->next = m_grouplist[i].userlist; strcpy(pu->name,uname); m_grouplist[i].userlist = pu; strcpy(uname,"1 "); if (send(sock,uname,strlen(uname),0) <0) MessageBox("Khong goi duoc reply cho ULOGIN"); return; } errordisp: strcpy(uname,"0 "); if (send(sock,uname,strlen(uname),0) <0) MessageBox("Khong goi duoc reply cho ULOGIN"); } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 72
  48. Xây dựng module Server MiniChatter void CMiniChatServerDlg::Do_logout(SOCKET sock) { char *ps; int i = Findgroup(sock,&ps); T_UserRec *pu, *pup; if (i >= 0) { pu = m_grouplist[i].userlist; while (pu && pu->sock != sock) { pup = pu; pu = pu->next; } if (pu==m_grouplist[i].userlist) m_grouplist[i].userlist = pu->next; else pup->next = pu->next; pu->next = sock_no_user; sock_no_user = pu; } } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 73
  49. Xây dựng module Server MiniChatter void CMiniChatServerDlg::OnSelchangeGroup() { // TODO: Add your control notification handler code here char gname[50]; int i; i=m_groupbox.GetCurSel(); m_groupbox.GetText(i,gname); // tim group tuong ung for (i=0; i groupcnt) return; T_UserRec *pu = m_grouplist[i].userlist; m_userbox.ResetContent (); while (pu) { m_userbox.AddString (pu->name); pu = pu->next ; } } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 74
  50. Xây dựng module client MiniChatter 2. Dịch, chạy và kiểm thử từng chức năng của ứng dụng. Khó khăn của việc kiểm thử module client (hay module server) là cần phải có ₫ối tác chạy ₫ồng thời với mình. Do ₫ó, chúng ta sẽ debug module MiniChatter Server ₫ồng thời với module MiniChatter Client ₫ã viết ₫ược ở mục 2.1 trước ₫ây. Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 2 : Viết hệ thống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện Trường ĐH Bách Khoa Tp.HCM Slide 75