1、static char THIS_FILE = _FILE_;#endif/ CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialogpublic: CAboutDlg(); enum IDD = IDD_ABOUTBOX ; protected: virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV supportprotected: DECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialog(CAbou
2、tDlg:IDD)void CAboutDlg:DoDataExchange(CDataExchange* pDX) CDialog:DoDataExchange(pDX);BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)END_MESSAGE_MAP()/ CClientDlg dialogCClientDlg:CClientDlg(CWnd* pParent /*=NULL*/) : CDialog(CClientDlg:IDD, pParent) m_strDisplay = _T(); m_strSend = _T( m_bWhispering = FALSE
3、; m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);void CClientDlg: DDX_Control(pDX, IDC_LIST_USER, m_lbUser); DDX_Text(pDX, IDC_EDIT_DIAPLAY, m_strDisplay); DDX_Text(pDX, IDC_EDIT_SEND, m_strSend); DDX_Check(pDX, IDC_CHECK_WHISPERING, m_bWhispering);BEGIN_MESSAGE_MAP(CClientDlg, CDialog) ON_WM_SYSCOMM
4、AND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BN_CONNECT, OnBnConnect) ON_BN_CLICKED(IDC_BN_CLOSE, OnBnClose) ON_BN_CLICKED(IDC_BN_SEND, OnBnSend) ON_MESSAGE(WM_RECEIVE, OnReceive) ON_MESSAGE(WM_SOCKETCLOSE, OnServerClose) ON_MESSAGE(WM_SEND, OnSend) ON_MESSAGE(WM_CONNCET, OnConnect) O
5、N_LBN_DBLCLK(IDC_LIST_USER, OnDblclkListUser)/ CClientDlg message handlersBOOL CClientDlg:OnInitDialog()OnInitDialog(); ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR);AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); SetIcon(m_hIcon, TRUE); / Set big ico
6、n SetIcon(m_hIcon, FALSE); / Set small icon / 参数初始化 m_Socket.Initialize(this); m_strNetIP = _T(127.0.0.1 m_iNetPort = 3127; m_bConnect = FALSE; GetDlgItem(IDC_BN_CLOSE)-EnableWindow(FALSE); GetDlgItem(IDC_BN_SEND)- return TRUE; / return TRUE unless you set the focus to a controlOnSysCommand(UINT nID
7、, LPARAM lParam) if (nID & 0xFFF0) = IDM_ABOUTBOX) CAboutDlg dlgAbout; dlgAbout.DoModal(); else CDialog:OnSysCommand(nID, lParam);OnPaint() if (IsIconic() CPaintDC dc(this); / device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); int cxIcon = GetSystemMetrics(SM_CX
8、ICON); 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);OnPaint();HCURSOR CClientDlg:OnQueryDragIcon() return (HCURSOR) m_hIcon;OnBnConnect() CString strConnectErr
9、or; / 获取用户名字 CInputDlg inputDlg; int iResult = inputDlg.DoModal(); if(iResult=IDCANCEL)return; m_strName = inputDlg.m_strName; / 创建套接字 if(!m_Socket.Create() strConnectError.LoadString(IDS_FAIL_CREATE_SOCKET); ShowInDisplay(strConnectError); return; CString strInfo; strInfo.LoadString(IDS_CONNECTING)
10、; ShowInDisplay(strInfo); / 连接服务器m_Socket.Connect(m_strNetIP, m_iNetPort) int n = m_Socket.GetLastError(); strConnectError.LoadString(IDS_FAIL_CONNECT); strInfo.LoadString(IDS_SUCCEED_CONNECT); m_bConnect = TRUE; / 发送自已的名字 NETMESSAGE netMessage(PTC_NEW, m_strName, _T(), _T(); m_Socket.SendMsg(netMes
11、sage); GetDlgItem(IDC_BN_CONNECT)-EnableWindow(TRUE);OnBnClose() if(m_bConnect) m_Socket.Close(); m_bConnect = FALSE; GetDlgItem(IDC_BN_CONNECT)- GetDlgItem(IDC_BN_CLOSE)- GetDlgItem(IDC_BN_SEND)- m_lbUser.ResetContent(); CString strMsg; strMsg.LoadString(IDS_BREAK); ShowInDisplay(strMsg);OnBnSend()
12、 OnSend(); UpdateData(FALSE);OnReceive() NETMESSAGE netMessage; m_Socket.Receive(char *)&netMessage, sizeof(netMessage); CString strForm = netMessage.form; / 过滤自已发出的信息 if(strForm=m_strName) return; CString strTo = netMessage.to; CString strMsg = netMessage.data; switch(netMessage.type) case PTC_USER
13、_LIST: / 用户列表 m_lbUser.AddString(strMsg); break; case PTC_NEW: / 新用户进入 m_lbUser.AddString(strForm); ShowInDisplay(strMsg); case PTC_SAY: ShowMessage(netMessage); case PTC_WHISPERING: / 密语 if(strTo!=m_strName) return; case PTC_CLIENT_QUIT: / 有用户退出 m_lbUser.DeleteString(m_lbUser.FindString(-1, strForm
14、);OnServerClose()m_bConnect) return; CString strMsg; strMsg.LoadString(IDS_SERVER_CLOSE); ShowInDisplay(strMsg); m_Socket.Close(); m_lbUser.ResetContent();OnSend() UpdateData(TRUE); / 主要是填充NETMESSAGE结构体 strcpy(netMessage.form, m_strName); strcpy(netMessage.data, m_strSend); / 取得列表框中的用户 if(m_lbUser.G
15、etText(m_lbUser.GetCurSel(), netMessage.to)=LB_ERR) strcpy(netMessage.to, _T( if(m_bWhispering) / 密语 CString strTo = netMessage.to; if(strTo=_T() MessageBox(请选择对方!, 错误 return; netMessage.type = PTC_WHISPERING;所有人 netMessage.type = PTC_SAY; / 发送该信息 / 显示发送信息 ShowInDisplay(你对 + strTo + 说: + strMsg);Sho
16、wInDisplay(CString str) m_strDisplay += str + rn;ShowMessage(const NETMESSAGE &netMessage) if(strTo=_T() strTo = else if(strTo=m_strName)你 CString strOut = strForm + 对 + strMsg; ShowInDisplay(strOut);OnDblclkListUser() / TODO: Add your control notification handler code here m_lbUser.SetCurSel(-1);On
17、Connect()(二)服务端服务器端聊天程序必须能够做3件事情:(1)服务器聊天程序要在待定的端口上等待来自聊天客户的连接请求,并且需要维护一个客户连接表,以记录所有成功的连接。(2)服务器聊天程序要及时接受从各个聊天客户发送过来的信息,然后把这些信息转发到一个或多个客户连接。对于公共聊天室,服务器将把接受到的信息向除源端外的所有客户发送过去。(3)服务器还要监控这些连接的状态,在客户主动离开或发生故障时从列表中删除相应的表项,并及时更新连接表。服务端程序如下:/ ServerDlg.cpp :Server.hServerDlg.h/ CServerDlg dialogCServerDlg:
18、CServerDlg(CWnd* pParent /*=NULL*/) CDialog(CServerDlg:LoadIcon(IDI_ICONAPP);void CServerDlg: DDX_Control(pDX, IDC_LIST_USER, m_lbUser); DDX_Text(pDX, IDC_EDIT_DISPLAY, m_strDisplay);BEGIN_MESSAGE_MAP(CServerDlg, CDialog) ON_BN_CLICKED(IDC_BN_START, OnBnStart) ON_MESSAGE(WM_CLIENTCLOSE, OnClientClose) ON_MESSAGE(WM_ACCEPT, OnAccept) ON_WM_DESTROY()/ CServerDlg message handlersBOOL CServerDlg:AppendMenu(MF_SEPARA
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1