1、第24章 网络编程研发实践:即时通信软件,即时通信系统是互联网时代常见的网络应用软件,网民的生活也已经离不开即时通信软件,如QQ、MSN等。即时通信软件的开发并不难,仅仅是实现最简单的“发送”和“接收”功能即可,因此,学习即时通信软件,可以方便初学者掌握TCP/IP网络程序设计。 本章的主要内容有: C/S程序设计的系统模型和设计思路。 即时通信软件的开发:读者可以学会C/S模式的即时通信软件的开发,包括服务器端程序设计和客户端程序设计。,24.1 网络编程实例:即时通信系统,IM是英文Instant Messaging的缩写,中文翻译成“即时通信”,是基于互联网协议的应用程序,它能够使应用不
2、同类型设备的用户一对一进行通信。典型的IM是这样工作的:当好友列表(buddy list)中的某人在任何时候登录上线并试图通过用户的计算机联系用户时,IM系统会发一个消息提醒用户,然后用户能与对方建立一个聊天会话并键入消息文字进行交流。IM的出现和互联网有着密不可分的关系,从技术上来说,IM完全基于TCP/IP网络协议族实现,而TCP/IP协议族是整个互联网得以实现的技术基础。IM最传统的形式是聊天,在聊天的同时可以在计算机之间交换短文本消息。聊天服务是互联网提供的重要服务之一。互联网的大多数网站都建有聊天室,并且有专业聊天网站提供服务。1999年2月,腾讯公司自主开发了基于Internet的
3、即时通信网络工具腾讯即时通信(Tecent Instant Messenger,简称TIM或腾讯QQ),其合理的设计、良好的易用性、强大的功能、稳定高效的系统运行,赢得了用户的青睐。与电子邮件服务相比,聊天服务具有实时性,人们更便于相互沟通、交流思想和信息。,24.1.1 功能需求,即时通信系统的主要功能要实现如下: 服务器的建立,这个是实现聊天的关键,只有建立了聊天服务器,客户才能连接到上面,从而进行聊天过程的实现,服务器建立之后处于监听状态,等待客户机的申请连接。 在服务器建立的时候,选择是何种连接方式,TCP还是UDP,选择的不同,将会采用不同的消息处理机制。同时将确定连接的地址和端口号
4、。 启动客户端,开始尝试对服务器进行连接操作,这里面注意之处就是客户机要选择和服务器一致的连接方式,填入正确的连接地址和端口号。 成功建立连接之后,开始进行对话操作,对应不用的方面,出现的消息也是不同的,这样做的好处就是能够屏蔽他人的信息,而只要求显示对自己有用的信息,一来可以节省程序设计的耗时,二来可以保护聊天室中的隐私。 建立了一个连接之后,其他的客户机也是可以再连接到上面,这样可以进行多用户的信息交互。 聊天结束之后,客户机断开连接也就退出了聊天的过程,信息不再交互,如果是服务器关闭,连接在上面的所有客户机将会断开。,24.1.2 项目系统模型,该项目由两个程序组成: 服务器端应用程序:
5、主要是负责信息转发和存储,以及通信端口和通信用户的管理。 客户机端应用程序:主要是负责提供给非专业技术人员用户,用户通过客户机可以和其他客户机或者服务器进行通信。,系统模型,24.1.3 系统设计思路,基于客户机/服务器(Client/Server)模式的聊天室设计采取的是监听(侦听)对话模型。基本思路是:服务器启动监听进程,监听连接申请,对于来申请的客户机,或者说申请的ID,服务器进程将会对其进行判别和分类,满足服务器要求就进行连接。系统设计思路可用下图表示:,聊天室的C/S模型设计框架,24.1.4 功能分析和设计难点,即时通信系统IM最传统的形式是聊天,在聊天的同时可以在计算机之间交换短
6、文本消息。聊天服务是互联网提供的重要服务之一与电子邮件服务相比,聊天服务具有实时性,更便于人们相互沟通和交流信息。本设计的主要任务是利用Visual C+6.0这个集成开发环境设计并实现一个基于C/S模型的聊天室。,客户机端的功能,24.1.5 设计难点的解决方案,一般而言,一个项目的解决方案是多种多样的,容易实现的方案往往功能性缺点比较多,而要想功能完善,人力成本往往又比较高。鉴于本章是学习型的项目开发,选取方案方面尽量直观简单,以达到容易入手的目的。主要模块的解决方案如下: (1)建立通信框架 (2)网络连接类CsocketComm (3)创建服务器Server (4)创建客户机Clien
7、t (5)UDP协议中多用户聊天的实现,24.2 软件项目开发过程:服务器端应用程序,学习一个基于Windows的网络编程,其主要目的并不是为了做项目而做项目,读者应该将学习的重点转移到理论学习上,即学习开发一个项目,就要学会触类旁通,因为软件项目研发会根据业务流程或软硬件环境的不同而不同,而在纷繁复杂的条件下,核心理论是不变的。,开发流程,24.2.1 创建一个支持套接字的MFC服务器端程序,创建服务器端程序支持套接字的MFC应用程序的步骤如下: (1)单击“File”菜单,选中“New”命令,新建VC项目。 (2)创建MFC应用程序项目,并命名为“ChatServer”。,选择Socket
8、s支持,24.2.2 实现界面设计,实现界面设计不仅仅只是设计一个界面,还需要对界面的控件名称和控件绑定的变量进行定义。 1界面设计 2编辑控件与变量绑定,将聊天记录变量设置为控件变量,24.2.3 定义类设计,在服务器端,首先应该明确服务器的任务,在前文所述,服务器的任务有3个:聊天记录的转发、端口管理和用户管理。在本章中,用户管理的功能暂且不实现,因此主要应该实现前两个功能。将这两个功能封装在两个类中: CSocketComm类:该类负责网络连接、信息转发等。 CSocketManager类:该类负责端口的管理。 一般在VC项目中,类的定义都要放在头文件中,而类的实现都会放在源文件中,而且
9、头文件和源文件的文件名相同,只是扩展名不同,如图所示,使用集成开发环境分别为这两个类添加头文件和源文件。,添加两个类的头文件和源文件,24.2.4 实现类设计中的函数,实现类设计主要就是实现几个主要的函数,开发的流程如图24.10所示。,类的函数实现开发流程,24.2.5 实现界面功能按钮,服务器端的界面主要有3个功能按钮: 启动:单击该按钮,则启动服务器以提供C/S模式系统的服务。 停止:单击该按钮,则停止服务器以提供C/S模式系统的服务。 发送:单击该按钮,则在服务器端向全部在线用户广播一条消息。,24.2.6 测试,按F5编译并运行“ChatServer”项目,选择TCP连接方式,并单击
10、“启动”按钮,可以得到运行效果如图所示。,服务器端运行效果,24.3 软件项目开发过程:客户端端应用程序,服务器端程序只是提供相关的网络通信服务,而客户端程序是直接面向用户的终端程序。在商业化的应用总,客户端程序的方便性、美观性和功能性方面的特点直接会影响到商业运作的成功与否。因此,客户端程序在C/S架构的应用项目中也是非常重要的。,24.3.1 创建一个支持套接字的MFC客户端程序,创建服务器端程序支持套接字的MFC客户端应用程序的步骤如下: (1)单击“File”菜单,选中“New”命令,新建VC项目。 (2)创建MFC应用程序项目,并命名为“ChatClient”。 (3)创建“基于对话
11、框”的MFC应用程序项目,并在MFC应用程序向导的第2步中将“Windows Sockets”选项勾上。其余选项默认,单击“Finish”按钮完成应用程序向导并生成应用程序框架。 注意:在MFC应用程序框架下创建支持套接字的服务器端程序和客户端程序的步骤是一样的。,24.3.2 实现界面设计,(1)界面设计。 即时通信聊天系统的客户端程序界面设计如图所示,主要辅助功能是:设置需要连接的服务器地址和端口,选择Socket类型和填写登陆的用户名。(2)编辑控件与变量绑定。 首先,将“Socket类型”单选框中的“TCP”单选框设置属性为“GROUP”。 其次,设置界面中的所有编辑框的ID和与之绑定
12、的变量,如表所示。,客户端应用程序的界面设计,编辑框控件和变量绑定,24.3.3 定义类设计和实现类设计中的函数,其实客户端跟服务器端虽然在功能上和职责上并不相同,但是作为通信的双方,很多功能都是相互的,在本项目中,客户端的主要功能也是要定义两个类: CSocketComm类:该类负责网络连接、信息转发等。 CSocketManager类:该类负责端口的管理。 注意:在功能上和代码结构上,都跟服务器端很相似,只是界面的实现代码不同,具体详见光盘源码第24章。,24.3.4 实现界面功能按钮,客户机端的界面主要有3个功能按钮: 连接服务器:单击该按钮,则自动搜索局域网内的服务器,如果有,则连接成
13、功,可以进行下一步的通信操作。 断开服务器:单击该按钮,则停止发送断开服务器的信号给服务器端,告知服务器端本地已经放弃连接。 发送:单击该按钮,则向服务器端发送一条信息,这条信息的转发则由服务器端负责。,24.3.5 测试,按F5编译并运行“ChatClient”程序,在此之前,先保证“ChatServer”应用程序已经启动。本小节的测试是在同一台PC机上进行的,读者也可以在局域网内的若干个PC机上进行测试。 具体的操作步骤如下: (1)启动服务器端程序,并将服务器端的Socket类型设置成为“UDP”模式,端口为“5000”(默认值)。 (2)启动客户端,选择Socket类型为“UDP”模式
14、,登陆名为“古万荣”,端口为默认的“5000”;然后单击“连接服务器”。 (3)启动客户端,选择Socket类型为“UDP”模式,登陆名为“谢贤芬”,端口为默认的“5000”;然后单击“连接服务器”。 (4)在两个客户端分别输入聊天信息,观察两个客户端“聊天记录”编辑框和服务器端的“聊天记录”编辑框的信息变化。,24.4 小结,本章是以一个C/S模式的即时通信系统作为范例来讲解的,从理论上来说,C/S模式的即时通信系统的开发是比较简单的,但要做到功能完善、界面华丽又方便使用,则需要花费更多的心思。 通过本章的学习,读者应该掌握的是网络编程最基础的程序设计: 实现服务器的启动。 实现服务器和客户机端的信息发送。,