2024年3月27日发(作者:)
利用CAsyncSocket类编程 – 客户端程序
利用CAsyncSocket类编程 – 客户端程序
一、编程思路:
1. 建立工作区(解决方案):CAsyncSocket通信示例
2. 为服务器建立工程(项目):TalkS
3. 为客户端建立工程(项目):TalkC
操作步骤:
文件 > 新建 > 项目 > Visual C++ > MFC > MFC应用程序
在“名称”后输入:TalkC
在“解决方案名称”后输入:CAsyncSocket通信示例
如下图所示:
单击“确定”按钮出现:
1 / 16
利用CAsyncSocket类编程 – 客户端程序
单击“下一步”出现下图:选择“基于对话框”
单击“下一步”出现下图:把“关于”框前的选项去掉,在“对话框标题”中输入:客户端
程序,这样程序运行时的标题栏就会出现“客户端程序”字样
2 / 16
利用CAsyncSocket类编程 – 客户端程序
单击下一步出现下图:选择“windows套接字”
单击“下一步”出现下图:
可以看出,此时我们建立的工程TalkC有两个类CTalkCApp和CTalkCDlg,前一个是应用程序
类,无需干预,后一个是程序的主界面即对话框类,是我们重点关注的对象。
CTalkCDlg的第一个字母C表示这是一个类,中间的TalkC表示工程名称,Dlg表示对话框。
3 / 16
利用CAsyncSocket类编程 – 客户端程序
类CTalkCDlg的两个相关文件是TalkCDlg.h和
.h文件中包含该类的定义(Definition),.cpp文件中包含该类实现(Implementation)
单击 “完成”显示下图:
下一步开始编辑文本框的界面:
1. 逐一向界面中添加Static Text(静态文本)控件、Edit(文本框)控件、List(列表框)控件和
Button(按钮)控件,结果如下图所示:
4 / 16
利用CAsyncSocket类编程 – 客户端程序
这个地方时静态文本控件IDC_STATIC_STATUS,因其
Caption属性为空,所以暂时看不见
特别要注意的是:
列表框IDC_LIST_SENT和IDC_LIST_RECEIVED的Sort属性要置为false
发送按钮IDC_BUTTON_SEND的Default Button属性要置为true变成蓝色显示
控件的ID和属性的表格
ID
控件类型 Caption属性
Static Text
Static Text
Static Text
Static Text
Static Text
Static Text
Edit Box
Edit Box
Edit Box
List Box
List Box
Button
Button
Button
IDC_BUTTON_CONNECT
IDC_BUTTON_CLOSE
IDC_BUTTON_SEND
连接
断开
发送
IDC_EDIT_SNAME
IDC_EDIT_SPORT
IDC_EDIT_MSG
IDC_LIST_SENT
IDC_LIST_RECEIVED
IDC_STATIC_SNAME
IDC_STATIC_SPORT
IDC_STATIC_MSG
IDC_STATIC_SENT
IDC_STATIC_RECEIVED
IDC_STATIC_STATUS
服务器名称
服务器端口
消息
发送的消息
接收的消息
2. 为刚刚创建的控件建立变量:
在VC++6.0中可以通过类向导(Class Wizard)添加,在VS2010中手段更多,可直接在控件上
单击右键添加控件变量即可,控件和对应的变量如下:
5 / 16
利用CAsyncSocket类编程 – 客户端程序
控件的ID
(Control IDs)
IDC_STATIC_SNAME
IDC_STATIC_SPORT
IDC_STATIC_MSG
IDC_STATIC_STATUS
IDC_EDIT_SNAME
IDC_EDIT_SPORT
IDC_EDIT_MSG
IDC_LIST_SENT
IDC_LIST_RECEIVED
IDC_BUTTON_CLOSE
IDC_BUTTON_SEND
变量名称
(Member Variable Name)
m_staSName
m_staSPort
m_staMsg
m_staStatus
m_editSName
m_strSName
m_editSPort
m_strSPort
m_editMsg
m_strMsg
m_listSent
m_listReceived
m_btnClose
m_btnSend
变量类别
(Category)
Control
Control
Control
Control
Control
Value
Control
Value
Control
Value
Control
Control
Control
Control
Control
变量类型
(Variable Type)
CStatic
CStatic
CStatic
CStatic
CEdit
CString
CEdit
UINT
CEdit
CString
CListBox
CListBox
CButton
CButton
CButton
IDC_BUTTON_CONNECT m_btnConnect
本例中我们为Static Text以及Button类控件都定义了对应的变量,这样在形如:
GetDlgItem(IDC_STATIC_SNAME)->EnableWindow(true);
的代码中即可用:m_Window(true);来替代。
3. 为三个按钮类的控件对象添加相应的响应函数,即指定当单击该控件时的相应动作
可从类向导中设置,也可双击按钮设置,按钮和相应的事件响应函数如下:
控件对象和ID
连接按钮(IDC_BUTTON_CONNECT)
断开按钮(IDC_BUTTON_CLOSE)
发送按钮(IDC_BUTTON_SEND)
到此为止,我们已经建立了一个较为完整的对话框界面,此时虽然通信过程以及套接字等尚
未建立,但程序已经能够运行,由于MFC仅仅创建了三个按钮的事件响应函数的框架,即
函数体是空的,因此当我们单击三个按钮时程序无反应。
为了进行数据通信,本程序还需从CAsyncSocket类派生一个套接字类,不妨记为CMySocket
类。创建一个MFC类的可从“类向导”开始进行,如下图所示:
消息(Message) 响应函数(Member Functions)
BN_CLICKED (单击事件)
OnBnClickedButtonConnect()
OnBnClickedButtonClose()
BN_CLICKED
BN_CLICKED
OnBnClickedButtonSend()
6 / 16
利用CAsyncSocket类编程 – 客户端程序
进入:
单击“添加类”进入:
7 / 16
利用CAsyncSocket类编程 – 客户端程序
单击“完成”后,类CMySocket以及创建完毕。
之后为新创建的CMySocket类添加虚函数OnConnect()、OnClose()和OnReceive()
这三个虚函数都继承自CAsyncSocket类:
当且仅当发生FD_CONNECT事件时,自动调用OnConnect()
当且仅当发生FD_CLOSE事件时,自动调用OnConnect()
当且仅当发生FD_READ事件时,自动调用OnConnect()
?这三个事件是什么时候产生的
当CAsyncSocket::Connect()后,自动产生FD_CONNECT事件用于通知请求连接的套接字,其
所发出的连接请求已被处理,这种处理过程并不意味着成功!
当CAsyncSocket::Close()被调用时会自动产生FD_CLOSE事件
当一个套接字对象的数据输入缓冲区收到数据时,自动产生FD_READ事件,用于通知该套
接字此时可调用Receive()来接收数据。
?CAsyncSocket类一共有几种消息?
FD_WRITE
FD_ACCEPT
FD_OOB
接着需要为CMySocket创建成员变量和成员函数(在类视图中添加)
private成员变量:CTalkCDlg* m_pDlg;
void SetParent(CTalkCDlg* pDlg);
8 / 16
利用CAsyncSocket类编程 – 客户端程序
其次要为对话框类CTalkCDlg类添加成员变量和成员函数
CMySocket m_sockConnect;
void OnClose();
void OnConnect();
void OnReceive();
以上三个函数可将套接字的响应函数变换为对话框的操作。
至此,完成的程序框架已经建立!后续工作就是在框架中添加代码了!
需要添加代码的文件是:
MySocket.h
TalkCDlg.h
MySocket.h程序代码如下:
其中仅有:
class CTalkCDlg;
需要用户自己添加,其他都是自动生成的代码!
下列程序代码中需要同学们添加的行后都标注为
//****样式
9 / 16
利用CAsyncSocket类编程 – 客户端程序
10 / 16
利用CAsyncSocket类编程 – 客户端程序
TalkCDlg.h如下:
11 / 16
利用CAsyncSocket类编程 – 客户端程序
以上代码中除:class CMySocket;之外都是MFC自动生成的。
12 / 16
利用CAsyncSocket类编程 – 客户端程序
13 / 16
利用CAsyncSocket类编程 – 客户端程序
14 / 16
利用CAsyncSocket类编程 – 客户端程序
15 / 16
利用CAsyncSocket类编程 – 客户端程序
OVER
16 / 16


发布评论