11.2.2 功能实现(2)

2013-10-07 13:02:51 · 作者: · 浏览: 89

11.2.2  功能实现(2)

保存并编译运行以上代码,当客户端向服务器发送连接请求后,服务器同意连接并将客户端的相关信息显示在列表控件中,如图11.25所示。

 
图11.25  服务器显示连接客户端的相应信息
当服务器端接收客户端所发送的消息以后,服务器还应该将该消息转发到客户端指定的接收方。因此,在服务器套接字的消息响应函数中,还需要添加相应的代码,其代码如下:
  1. {  
  2. ...         //省略部分代码  
  3. for(int i=0;i<5;i++)  
  4. {  
  5.   if(msg[i].qq.m_name1== m_list.GetItemText(i,3)) 
    //判断昵称是否存在  
  6. {  
  7. send(msg[i].s,&msg[i].qq.msg,1024,NULL);       
    //将信息转发到接收方  
  8.   }  
  9. }  
  10. ...         //省略部分代码  

同时,用户也可以双击列表中指定客户端的昵称,向该客户端发送信息。该功能在列表控件的双击消息响应函数OnDblclkList1()中实现。代码如下:

  1. void CQQDlg::OnDblclkList1(NMHDR* pNMHDR, LRESULT* pResult)  
  2. {  
  3. POSITION pos=m_list.GetFirstSelectedItemPosition();
    //获取鼠标双击位置  
  4. if(pos==NULL)//判断位置是否为空  
  5. {  
  6.     MessageBox("用户双击的位置错误或该列表为空!");  
  7. }  
  8. else  
  9. {  
  10.         int nItem=m_list.GetNextSelectedItem(pos);  
  11.         //获取该位置的索引值  
  12.     CString  str=m_list.GetItemText (nItem,1);  
    //获取相应的客户号码或昵称  
  13. CString  str1=m_list.GetItemText (nItem,2);  
  14. CMessage mesg;              //定义消息发送框对象  
  15. mesg.m_num=str;             //对话框初始化时赋值  
  16. mesg.m_ip=str1;  
  17. mesg.DoModal( );            //显示消息发送框  
  18. }  
  19.     *pResult = 0;  

当用户双击列表控件中的某一项时,会弹出消息发送对话框,如图11.26所示。

 
图11.26  显示消息发送对话框
在消息发送对话框中,用户单击"回复"按钮,程序会显示信息输入框以及"发送"功能按钮。代码如下:

  1. void CMessage::OnRelay()    //"回复"按钮消息响应函数  
  2. {  
  3.     GetDlgItem(IDC_TEXT2)->ShowWindow(true);    //使按钮控件可见  
  4.     GetDlgItem(IDC_SEND)->ShowWindow(true);  

运行上面的程序,用户单击"回复"按钮后,消息发送对话框会显示信息发送编辑框以及"发送"按钮,如图11.27所示。

 
图11.27  显示编辑框和"发送"按钮
其中,"发送"按钮的消息响应函数功能是将用户编辑的信息发送到指定客户端。代码如下:

  1. void CMessage::OnSend()  
  2. {  
  3. CString msg,str;            //定义字符串变量  
  4. GetDlgItem(IDC_TEXT2)->GetWindowText(msg);      
    //获取消息编辑框中的内容  
  5. GetDlgItem(IDC_IP)->GetWindowText(str);     //获取显示的IP地址  
  6. for(int i=1;i<=m_list.GetItemCount();i++)      
    //循环获取列表控件中的IP地址  
  7. {  
  8.     CString m_ip;           //定义字符串变量  
  9.     m_list.GetItemText(i,m_ip);//获取列表项目中的IP地址  
  10.     if(m_ip==str)           //若IP地址相同  
  11.     {  
  12.     send(msg[i].s,msg.GetBuffer(1),sizeof(msg),
    NULL);//发送信息到客户端  
  13.     }  
  14. }  
  15. }  

在服务器端,用户已经实现了一些常用的功能。当用户学习本节知识时,需要将书中的理论知识与实例代码相结合,这样学习效果将比较明显。

2.客户端功能实现

在实例工程中,用户仅需要完成客户端向服务器端发送相关信息即可。首先,使用MFC应用程序向导为列表控件添加双击的消息响应函数OnDblclkList1()。然后,在该函数中显示消息发送对话框发送消息。代码如下:

  1. void CQQDlg::OnDblclkList1(NMHDR* pNMHDR, LRESULT* pResult)  
  2. {  
  3. POSITION pos=m_list.GetFirstSelectedItemPosition();//获取双击位置  
  4. if(pos==NULL)//判断位置是否为空  
  5. {  
  6.     MessageBox("用户双击的位置错误或该列表为空!");  
  7. }  
  8. else  
  9. {  
  10.         int nItem=m_list.GetNextSelectedItem(pos);  
  11.         //获取该位置的索引值  
  12.   CString  str=m_list.GetItemText(nItem,0);     
    //获取相应的客户号码或昵称  
  13. send.m_name="客户昵称:";    //对话框初始化时赋值  
  14. strcat(send.m_name.GetBuffer(1),str.GetBuffer(1));//连接字符串  
  15. mesg.DoModal( );            //显示消息发送框  
  16. }  
  17.     *pResult = 0;  

用户编译并运行以上代码后,鼠标双击客户端列表的某一项,程序将弹出消息发送对话框,如图11.28所示。

 
图11.28  弹出消息发送对话框
当程序弹出消息发送对话框后,用户便可以输入相应信息,单击"发送"按钮,将该信息发送到服务器端进行转发。代码如下:

  1. void CSend::OnSend()        //发送按钮消息响应函数  
  2. {  
  3.     CString str,str1;       //定义字符串变量  
  4. sockaddr_in addr;           //定义地址结构变量  
  5.  addr.sin_family=AF_INET;   //填充地址结构  
  6. addr.sin_port=htons(80);    //指定监听端口为80  
  7. addr.sin_addr.S_un.S_addr=inet_addr(str14); //指定主机IP地址  
  8.  connect(s,( sockaddr*)addr,sizeof(addr),NULL);//连接服务器  
  9. GetDlgItem(IDC_EDIT1)->GetWindowText(str);     
    //获取用户输入的数据  
  10. send(s,str.GetBuffer(1),sizeof(str),NULL);      //发送信息  
  11. GetDlgItem(IDC_EDIT2)->GetWindowText(str1); 
    //获取信息显示框中的内容  
  12. str1+="\r\n";               //添加回车换行符  
  13. str1+=str;//连接字符串  
  14. GetDlgItem(IDC_EDIT2)->SetWindowText(str1); 
    //设置信息显示框的内容  

用户将上面的代码保存、编译并运行后,便可以实现客户端向服务器端发送消息,如图11.29所示。

 
图11.29  消息发送对话框发送消息
注意:用户在学习过程中,可以在随书光盘的实例代码中,试着添加自己的代码。例如,为消息发送对话框设置背景等。这样,能促进用户的学习。