xxxxxxxxxxx实验用纸
ON_BN_CLICKED(IDC_BN_CLOSE, OnBnClose) ON_MESSAGE(WM_RECEIVE, OnReceive) ON_MESSAGE(WM_CLIENTCLOSE, OnClientClose) ON_MESSAGE(WM_ACCEPT, OnAccept) ON_WM_DESTROY() END_MESSAGE_MAP()
///////////////////////////////////////////////////////////////////////////// // CServerDlg message handlers BOOL CServerDlg::OnInitDialog() { CDialog::OnInitDialog(); ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon m_iNetPort = 3127; m_Server.Initialize(this); m_bServer = FALSE; GetDlgItem(IDC_BN_CLOSE)->EnableWindow(FALSE); return TRUE; // return TRUE unless you set the focus to a control }
void CServerDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } }
void CServerDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
第 9 页 共 26 页
xxxxxxxxxxx实验用纸
int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } }
HCURSOR CServerDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; }
void CServerDlg::OnBnStart() { // 创建套接字 m_Server.Create(m_iNetPort); // 开始监听 m_Server.Listen(); // 显示 CString strInfo; strInfo.LoadString(IDS_CREATE_SERVER); ShowInDisplay(strInfo); m_bServer = TRUE; GetDlgItem(IDC_BN_START)->EnableWindow(FALSE); GetDlgItem(IDC_BN_CLOSE)->EnableWindow(TRUE); }
void CServerDlg::OnBnClose() { CloseServer(); GetDlgItem(IDC_BN_START)->EnableWindow(TRUE); GetDlgItem(IDC_BN_CLOSE)->EnableWindow(FALSE); }
void CServerDlg::OnAccept() { // 创建新客户 CMySocket *pNewClient = new CMySocket; pNewClient->Initialize(this); m_Server.Accept(*pNewClient); // 放入链表中 m_lsClient.AddTail(pNewClient); }
void CServerDlg::OnClientClose(WPARAM wParam, LPARAM lParam) { CMySocket *p_delClient = (CMySocket*)wParam; // 关闭该用户 p_delClient->ShutDown();
第 10 页 共 26 页
xxxxxxxxxxx实验用纸
char buffer[BUFFERSIZE]; while(p_delClient->Receive(buffer, BUFFERSIZE)>0); p_delClient->Close(); // 在用户链表中删除该用户 POSITION psCur, psList = m_lsClient.GetHeadPosition(); CMySocket *p_curClient; while(psList!=NULL) { psCur = psList; p_curClient = (CMySocket *)m_lsClient.GetNext(psList); if(p_delClient==p_curClient) { m_lsClient.RemoveAt(psCur); break; } } // 发送信息告诉其他用户该客户退出 CString strMsg; strMsg.LoadString(IDS_CLIENT_CLOSE); NETMESSAGE netMessage(PTC_CLIENT_QUIT, p_delClient->GetName(), p_delClient->GetName() + strMsg); SendToAllClient(netMessage); // 界面上清理该用户信息 m_lbUser.DeleteString(m_lbUser.FindString(-1, p_delClient->GetName())); ShowInDisplay(p_delClient->GetName() + strMsg); // 删除该用户 delete p_delClient; }
void CServerDlg::OnReceive(WPARAM wParam, LPARAM lParam) { CMySocket *p_curClient = (CMySocket*)wParam; NETMESSAGE netMessage; p_curClient->Receive((char *)&netMessage, sizeof(netMessage)); switch(netMessage.type) { case PTC_NEW: // 新客户加入 NewClientAdd(p_curClient, &netMessage); break; case PTC_SAY: // 普通聊天 ShowMessage(netMessage); break; } // 把加工过的信息发送给其他用户 SendToAllClient(netMessage); }
void CServerDlg::CloseServer() { if(!m_bServer) return; // 向所有客户发送服务端关闭的信息 CString strInfo;
第 11 页 共 26 页
_T(\
xxxxxxxxxxx实验用纸
strInfo.LoadString(IDS_CLOSESERVER); NETMESSAGE netMessage(PTC_SYSTEM, _T(\ SendToAllClient(netMessage); // 服务端界面显示关闭信息 ShowInDisplay(strInfo); // 关闭服务端 m_Server.Close(); // 关闭客户端 char buffer[BUFFERSIZE]; CMySocket *m_pClient; POSITION psList = m_lsClient.GetHeadPosition(); while(psList!=NULL) { m_pClient = (CMySocket *)m_lsClient.GetNext(psList); m_pClient->ShutDown(); while(m_pClient->Receive(buffer, BUFFERSIZE)>0); m_pClient->Close(); delete m_pClient; } m_lsClient.RemoveAll(); m_bServer = FALSE; }
// 向所有户发出信息
void CServerDlg::SendToAllClient(const NETMESSAGE &netMessage) { CMySocket *m_pClient; POSITION psList = m_lsClient.GetHeadPosition(); while(psList!=NULL) { m_pClient = (CMySocket *)m_lsClient.GetNext(psList); m_pClient->SendMsg(netMessage); } }
void CServerDlg::ShowInDisplay(CString str) { m_strDisplay += str + \ UpdateData(false); }
void CServerDlg::OnDestroy() { CDialog::OnDestroy(); // TODO: Add your message handler code here }
// 新用户加入
void CServerDlg::NewClientAdd(CMySocket *p_client, NETMESSAGE *netMessage) { // 存入用户名字 p_client->SetName(netMessage->form); // 在列表框中显示该用户 m_lbUser.AddString(p_client->GetName()); // 发送用户列表给该客户
第 12 页 共 26 页

