11.2.2 功能实现(2)
保存并编译运行以上代码,当客户端向服务器发送连接请求后,服务器同意连接并将客户端的相关信息显示在列表控件中,如图11.25所示。
|
| 图11.25 服务器显示连接客户端的相应信息 |
- {
- ... //省略部分代码
- for(int i=0;i<5;i++)
- {
- if(msg[i].qq.m_name1== m_list.GetItemText(i,3))
//判断昵称是否存在- {
- send(msg[i].s,&msg[i].qq.msg,1024,NULL);
//将信息转发到接收方- }
- }
- ... //省略部分代码
- }
同时,用户也可以双击列表中指定客户端的昵称,向该客户端发送信息。该功能在列表控件的双击消息响应函数OnDblclkList1()中实现。代码如下:
- void CQQDlg::OnDblclkList1(NMHDR* pNMHDR, LRESULT* pResult)
- {
- POSITION pos=m_list.GetFirstSelectedItemPosition();
//获取鼠标双击位置- if(pos==NULL)//判断位置是否为空
- {
- MessageBox("用户双击的位置错误或该列表为空!");
- }
- else
- {
- int nItem=m_list.GetNextSelectedItem(pos);
- //获取该位置的索引值
- CString str=m_list.GetItemText (nItem,1);
//获取相应的客户号码或昵称- CString str1=m_list.GetItemText (nItem,2);
- CMessage mesg; //定义消息发送框对象
- mesg.m_num=str; //对话框初始化时赋值
- mesg.m_ip=str1;
- mesg.DoModal( ); //显示消息发送框
- }
- *pResult = 0;
- }
当用户双击列表控件中的某一项时,会弹出消息发送对话框,如图11.26所示。
|
| 图11.26 显示消息发送对话框 |
- void CMessage::OnRelay() //"回复"按钮消息响应函数
- {
- GetDlgItem(IDC_TEXT2)->ShowWindow(true); //使按钮控件可见
- GetDlgItem(IDC_SEND)->ShowWindow(true);
- }
运行上面的程序,用户单击"回复"按钮后,消息发送对话框会显示信息发送编辑框以及"发送"按钮,如图11.27所示。
|
| 图11.27 显示编辑框和"发送"按钮 |
- void CMessage::OnSend()
- {
- CString msg,str; //定义字符串变量
- GetDlgItem(IDC_TEXT2)->GetWindowText(msg);
//获取消息编辑框中的内容- GetDlgItem(IDC_IP)->GetWindowText(str); //获取显示的IP地址
- for(int i=1;i<=m_list.GetItemCount();i++)
//循环获取列表控件中的IP地址- {
- CString m_ip; //定义字符串变量
- m_list.GetItemText(i,m_ip);//获取列表项目中的IP地址
- if(m_ip==str) //若IP地址相同
- {
- send(msg[i].s,msg.GetBuffer(1),sizeof(msg),
NULL);//发送信息到客户端- }
- }
- }
在服务器端,用户已经实现了一些常用的功能。当用户学习本节知识时,需要将书中的理论知识与实例代码相结合,这样学习效果将比较明显。
2.客户端功能实现
在实例工程中,用户仅需要完成客户端向服务器端发送相关信息即可。首先,使用MFC应用程序向导为列表控件添加双击的消息响应函数OnDblclkList1()。然后,在该函数中显示消息发送对话框发送消息。代码如下:
- void CQQDlg::OnDblclkList1(NMHDR* pNMHDR, LRESULT* pResult)
- {
- POSITION pos=m_list.GetFirstSelectedItemPosition();//获取双击位置
- if(pos==NULL)//判断位置是否为空
- {
- MessageBox("用户双击的位置错误或该列表为空!");
- }
- else
- {
- int nItem=m_list.GetNextSelectedItem(pos);
- //获取该位置的索引值
- CString str=m_list.GetItemText(nItem,0);
//获取相应的客户号码或昵称- send.m_name="客户昵称:"; //对话框初始化时赋值
- strcat(send.m_name.GetBuffer(1),str.GetBuffer(1));//连接字符串
- mesg.DoModal( ); //显示消息发送框
- }
- *pResult = 0;
- }
用户编译并运行以上代码后,鼠标双击客户端列表的某一项,程序将弹出消息发送对话框,如图11.28所示。
|
| 图11.28 弹出消息发送对话框 |
- void CSend::OnSend() //发送按钮消息响应函数
- {
- CString str,str1; //定义字符串变量
- sockaddr_in addr; //定义地址结构变量
- addr.sin_family=AF_INET; //填充地址结构
- addr.sin_port=htons(80); //指定监听端口为80
- addr.sin_addr.S_un.S_addr=inet_addr(str14); //指定主机IP地址
- connect(s,( sockaddr*)addr,sizeof(addr),NULL);//连接服务器
- GetDlgItem(IDC_EDIT1)->GetWindowText(str);
//获取用户输入的数据- send(s,str.GetBuffer(1),sizeof(str),NULL); //发送信息
- GetDlgItem(IDC_EDIT2)->GetWindowText(str1);
//获取信息显示框中的内容- str1+="\r\n"; //添加回车换行符
- str1+=str;//连接字符串
- GetDlgItem(IDC_EDIT2)->SetWindowText(str1);
//设置信息显示框的内容- }
用户将上面的代码保存、编译并运行后,便可以实现客户端向服务器端发送消息,如图11.29所示。
|
| 图11.29 消息发送对话框发送消息 |




