MFC实现简单网络聊天程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

添加代码: //in MySocket.h class CMySocket : public CAsyncSocket { //省略代码(自动生成) public: void SetParent(CDialog* pWnd);//成员函数,设置指向父对话框的指针 // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(MySocket) public: virtual void OnAccept(int nErrorCode); virtual void OnConnect(int nErrorCode); virtual void OnClose(int nErrorCode); virtual void OnReceive(int nErrorCode); virtual void OnSend(int nErrorCode); //}}AFX_VIRTUAL // 省略代码(自动生成) protected: private: CDialog* m_pWnd;//私有成员变量,指向父对话框的指针 }; // in MySocket.cpp 以下代码很重复,都是调用对话框类的成员函数 void CMySocket::OnAccept(int nErrorCode) { // TODO: Add your specialized code here and/or call the base class if(nErrorCode==0)//判断是否有错误 ((CMySockDlg*)m_pWnd)->OnAccept();//没有错误,则调用对话框类的 OnAccept
创建 socket 类后,为该类添加一个私有成员变量 m_pWnd 作为指向父对话框的指针;然后 必须在该类中, 添加一个成员函数 SetParent 以设置该指针,该函数在 MySocket.cpp 文件中的 实现代码为: void CMySocket::SetParent(CDialog* pWnd) { m_pWnd=pWnd;//设置成员指针变量 } 最后,MySocket 类,还必须添加事件函数,用于调用对话框类中名字相同的成员函数。为 添加 OnAccept 事件函数,可以 ClassWizard 窗口中,单击右键|add virtual function…
// TODO: Add your control notification handler code here UpdateData(TRUE); //使控件与变量同步 if(m_iType==0) //m_iType=0 即 client 端 m_ctlConnect.SetWindowText("连接");//m_ctlConnect 为控件“连接”按钮的映射变 量 else m_ctlConnect.SetWindowText("监听"); } 运行程序,结果如下图所示: 选中“客户端”显示“连接” ;选中“服务器端”显示“监听” :
Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only.
函数 CAsyncSocket::OnAccept(nErrorCode); } void CMySocket::OnConnect(int nErrorCode) { // TODO: Add your specialized code here and/or call the base class if(nErrorCode==0)//判断是否有错误 ((CMySockDlg*)m_pWnd)->OnConnect();//没有错误, 则调用对话框类的 OnConnect 函数 CAsyncSocket::OnConnect(nErrorCode); } void CMySocket::OnClose(int nErrorCode) { // TODO: Add your specialized code here and/or call the base class if(nErrorCode==0)//判断是否有错误 ((CMySockDlg*)m_pWnd)->OnClose();//没有错误, 则调用对话框类的 OnClose 函数 CAsyncSocket::OnClose(nErrorCode); } void CMySocket::OnReceive(int nErrorCode) { // TODO: Add your specialized code here and/or call the base class if(nErrorCode==0)//判断是否有错误 ((CMySockDlg*)m_pWnd)->OnReceive();//没有错误,则调用对话框类的 OnReceive 函数 CAsyncSocket::OnReceive(nErrorCode); } CMySocket 类添加所有必要的事件函数后,应该对话框类添加一个 CMySocket 类变量。从 服务器的角度来看,对话框类需要 2 个变量,一个用于监听请求,一个用于与对方应用程序 的连接。故需要两个 CMySocket 对象,为对话框类添加两个成员变量。把两个变量的类型 指定为 CMySocket 类,访问方式两个都为私有,一个变量名为 m_sListenSocket,用于连接 请求的监听,另一个命名为 m_sConnectSocket,用于来回发送消息。 //in MySockDlg.h #include "MySocket.h" // CMySockDlg dialog class CMySockDlg : public CDialog { // 省略代码(自动生成的) private: CMySocket m_sConnectSocket; CMySocket m_sListenSocket;
数。 编辑该函数,添加如下代码: //in MySockDlg.cpp void CMySockDlg::OnRType() {
Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only.
Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only.
4.添加 CAsyncSocket 类的继承类 MySocket 为了使应用程序能够捕捉和相应 socket 事件,可以从 AsyncSocket 创建自己的派生类。该类 需要有自己版本的事件函数, 也需要一种把此事件传到对话框的方法。 为把每个事件传给对 话框类、添加一个指向父对话框的指针作为 socket 类的成员变量。对每个 socket 事件使用 此 指 针 调 用 事 件 函 数 。 具 体 做 法 , 如 图 所 示 :
Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only.
}; 注意:同时添加#include "MySocket.h" 5.初始化 CMySocket 类的成员函数 添加 CMySocket 变量后,添加所有变量的初始化代码。默认设置为:应用程序类型设置为 客户端程序,服务器名为 loopback,端口为 4000,在两个 CMySocket 对象中设置父对话框 的指针,指向对话框类对象。所有这些初始化,都在 OnInitDialog 函数中完成。 注意:计算机名 loopback 是 TCP/IP 网络协议的一个特殊名字,表示你正在这台计算机上工 作,这个内部计算机名网址为 127.0.0.1。需要与另一个程序连接,运行在同一台计算机上的 应用程序都用此名字和网址。 // in MySockDlg.cpp BOOL CMySockDlg::OnInitDialog() { //省略代码(自动生成的) // TODO: Add extra initialization here //初始化控件对应的变量 m_iType = 0; m_strName ="loopback"; m_iPort = 4000; //更新控件 UpdateData(FALSE); //设置 Socket 对应的对话框 m_sConnectSocket.SetParent(this); m_sListenSocket.SetParent(this); return TRUE; // return TRUE } 5.实现客户端与服务端间的连接功能 用户单击“连接”按钮后,就禁止了对话框上顶端的所有控件,此时,用户不可修改对方计 算机的设置或修改应用程序的监听方式。可以调用 Create 函数,其 Socket 变量根据应用程 序运行在客户机或服务器上而定。 最后调用 Connect 或 Listen 函数初始化应用程序端的连接。 unless you set the focus to a control
Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only.
MFC 实现简单网络聊天程序
看来得声明一下:这个程序的功能还很不健全,只是基本实现了消息的收发过程,而且 并不跟 QQ 似的那么灵活,因为没有快捷方式。关于程序无法运行的问题,很抱歉,我只是 大概组织了一下该应用程序的总体流程和重点代码的添加。 我再看了一下, 是有些代码没有 列出来。比如 MySocket 类中成员函数的实现代码,都没列举出来。不过现在已经添加!应 该可以运行出同样的界面了。 一个简单的用 MFC 实现的基于对话框的网络聊天程序 重点理解:基于对话框和类。 实现功能:可以选择作为客户端或服务器端;服务器连接过程;消息接收过程;关闭连接。 1.建立基于对话框的 MFC 工程 MySock 注意:①基于对话框;②支持 window socket。
服 务 器 名 List box 称 Static box List box Button
Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only.
注意:RClient 的属性设置中,要选上 Group 属性。 3.为控件添加对应的成员变量和映射消息响应函数 控件相应的成员变量设置如图所示
Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only.
Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only.
ຫໍສະໝຸດ Baidu
双击“发送”按钮,添加 OnBsend 函数;双击“关闭”按钮,添加 OnBclose 函数;复用“连 接”按钮,当选择客户端按钮时显示“连接” ;当选择服务端时显示“监听” 。为两个单选按 钮添加一个消息函数,根据当前选择的按钮修改命令的正文。具体做法是,双击 IDC_RCLIENT 控件,添加函数 OnRType 函数,同时双击 IDC_RSERVER 控件,添加该函
2.添加控件,并设置控件属性 控件类型 Group Box Radio Button RadioButton Static text Edit box Static text Edit box Button ID IDC_STATIC IDC_RCLIENT IDC_RSERVER IDC_SNAME IDC_ESERVERNAME IDC_SPORT IDC_EPORT IDC_BCONNECT 端口号 连接 socket 类型 客户端 服务器端 Caption 控件类型 Static box Edit box Button Static box ID IDC_SMSG IDC_EMSG IDC_BSEND IDC_SSEND IDC_LSEND IDC_SRECV IDC_LRECV IDC_BCLOSE 关闭 接收 发送 发送 Caption 消息
相关文档
最新文档