第3节 简单TCP通信
TCP的通信过程比UDP复杂得多,必须依据C/S架构基础进行开发,一般TCP通信软件都分为服务器端和客户端两部分。.TCP服务器端由一个侦听Socket和多个用于应答的Socket组成,每个应答Socket与客户端建立一对一的数据流通道。客户端程序只包含一个连接Socket,它在成功连接服务器后与某一个应答Socket进行一对一的数据通信。
服务器的侦听Socket就如同公司的前台接待员,不参与客户的订单买卖。当有上门联系的客户时引荐给客户经理,每一个应答Socket就代表一个客户经理。具体的数据交互过程,必须由应答Socket与客户端之间一对一地进行,如图15-12所示。

图15-12 TCP服务器的侦听和应答结构
创建工程名为“Server”和“Client”的两个对话框程序,用于演示通过CSocket类实现简单的TCP数据通信。在创建应用程序向导的第2页,选中“Windows Sockets”复选框。该选项在创建工程时自动向stdafx.h预编译头文件中增加afxsock.h头文件,并在App类的InitInstance进程启动函数中调用AfxSocketInit函数,如图15-13所示。

图15-13 MFC应用程序向导
1)创建工程完毕后查看stdafx.h预编译头文件,如图15-14所示。

2)再查看InitInstance函数。

图15-14 程序向导自动添加的代码
3)在Server工程中创建一个CSocket类的派生类CListenSocket,如图15-15所示。

图15-15 添加新类
4)用同样的方法再创建一个CScoket类的派生类CClientSocket,如图15-16所示。

图15-16 创建后的CSocket派生类
5)在CServerApp类的头文件中,添加一个指针链表类型的成员变量。

6)在CListenSocket类中添加虚函数OnAccept,用于截获客户端的连接。

7)在CClientSocket类中添加虚函数OnReceive,用于截获客户端发来的网络数据。


8)在CClientSocket类中添加虚函数OnClose,用于监测某个客户端是否断开了连接。
(https://www.daowen.com)
9)在主对话框类中,添加CListenSocket类型的成员变量。

10)修改主对话框初始化函数代码,创建Socket并开始侦听。

11)在Client工程的主对话框中增加一些控件,如图15-17所示。

图15-17 编辑主对话框资源
12)修改控件属性,见表15-4。
表15-4 主对话框的控件属性

13)创建一个CSocket的派生类CConnectSocket,如图15-18所示。

图15-18 创建后的CSocket派生类
14)在CConnectSocket类中添加虚函数OnReceive,用于截获服务器发来的网络数据。


15)在主对话框类的头文件中,添加一个CConnectSocket类型的成员变量。

16)修改主对话框初始化函数的代码。

17)在主对话框类中,添加“发送(&S)”按钮的消息映射函数OnOK。

18)编译并运行,测试服务器和客户端代码,如图15-19所示。
首先开启服务器程序,再在一台或多台计算机开启多个客户端程序进行测试,很明显这是一个简易的聊天室软件框架。

图15-19 查看运行结果