基于MFC的即时通讯软件的设计与实现

(整期优先)网络出版时间:2022-07-14
/ 3

基于MFC的即时通讯软件的设计与实现

朱焱,郭晓梅

(湖南科技学院,信息工程学院, 湖南,永州,425199)

在互联网上有很多即时通讯软件。由于安全性原因,企业内部网络与外网是物理隔离的,无法使用传统的即时通讯软件。本文开了一个专门为企业定制的通讯软件,该软件通过MFC、XML和Socket编程实现。其中客户端包含登录、用户列表和收发消息。服务器端包含主界面、组织管理和用户管理。最终通过测试,该基于MFC的即时通讯软件能够实现注册、登录、收发消息等基本功能,软件运行稳定。

关键词MFC; XML; Socket; 即时通讯

Design and Implementation of Instant Messaging Software Based on MFC

Zhu Yan, Guo Xiaomei

(College of Information Engineering, Hunan University of Science and Engineering, Yong Zhou425199, Hunan.)

Abstract

There are many instant messaging programs on the Internet. For security reasons, the Intranet is physically isolated from the Internet, and traditional IM software cannot be used. This paper develops a communication software specially customized for enterprises, which is implemented by MFC, XML and Socket programming. The client includes login, user list, and sending and receiving messages. The server contains the main interface, organization management, and user management. Finally through the test, the MFC based instant messaging software can achieve registration, login, send and receive messages and other basic functions, the software runs stably.

Key words:

MFC; XML;  Socket;  instant messaging

1 背景及意义

企业级的即时通信实际上也可以说是个人即时通信的应用延伸。据统计,90%以上的企业网内的终端机上都在运行QQ/MSN等个人即时通信软件,人们已经习惯于使用即时通信工具进行日常的工作联络。可是,大多数员工都是在没有获得企业许可的情况下使用个人即时通信工具,这给企业网络带来了比较大的安全和效率问题。加上个人即时通信工具经常让员工陷入非工作状态的聊天中,因此很多企业也通过各种手段禁止员工进行QQ/MSN等操作。在这种现状下,采用企业级的即时通信软件自然就成为了企业客户最好的解决方案,既满足了内部员工的沟通习惯,又解决了公司制度和网络安全等问题,一举两得。

即时通讯系统按照服务端程序是否由使用方维护管控,一般分两大类:SaaS部署和私有部署。平时在应用商店下载注册就可以使用APP 的基本都是SaaS部署的,用户只需要使用,无需操心运维。即时通讯系统私有部署一般在办公环境用的多,对硬件准备,安装部署,运维管理能力都有要求。如即时通专注的就是即时通讯系统私有化部署,让每个企事业单位搭建专属于自己的工作交流平台。

2系统开发相关技术和环境要求

本程序使用的是 TCP 协议实现的即时通信软件,程序是基于Java 语言开发的,主要用到的技术有:Socket 编程,自定义协议。如果使用普通的方法来标记一条消息的结束,如换行符,那么程序就不易扩展,只能发送纯文本消息,所以需要自己定义一种消息的格式,并且我们还需要提供发送消息与解析消息的方法。服务器端创建一个 ServerSocket,循环等待客户端的连接,每当有客户端连接,就获取到客户端的 Socket 对象,并将该对象交付给一个服务器端线程处理,服务器端线程会不断从 Socket 的输入流中解析出消息类型、长度及消息内容,然后根据类型执行不同的操作。

客户端与服务器建立连接,同时开启一个客户端线程接收服务器端发送的消息,客户端登录是向服务器发送一条登录命令,客户端向服务器发送一条消息首先需要包装成定义的消息格式,然后再发送给服务器。不管是发送消息还是发送命令其实本质都是一条消息,向服务器发送的消息都必须按照定义的格式来。

开发本软件之前,本地计算机需满足以下的条件。开发环境为Visual Studio 2015免费社区版。开发语言为C++/Win32API。开发环境运行平台为Windows7(SP1)以上。数据库管理系统软件为ACCESS。

3 需求分析与总体设计

在人们越来越认识到软件工程在软件开发中的重要作用。目前国内软件在开发中还没有对软件开发的过程进行明确规定,文档不完整,也不规范,软件项目的成功往往归功于软件开发组的一些杰出个人或小组的努力。这种依赖于个别人员上的成功并不能为全组织的软件生产率和质量的提高奠定有效的基础,只有通过建立全过程的改善,采用严格的软件工程方法和管理,并且坚持不懈地付诸实践,才能取得全组织的软件过程能力的不断提高,使软件开发更规范合理。

最简单聊天室的群聊,线程池、多线程编程、超时重传确认收包等都不涉及,考虑有两个以下程序。服务器:能接受新的客户端的连接,并将每个客户端发过来的消息发给所有其他的客户端。客户端:能够连接服务器,并向服务器发送消息,同时接收服务器发过来的任何消息根据对实际情况的需求分析,该软件应该满足以下几个功能需求。具有良好的人机交互界面。实现消息的实时传输。能够发送图片,丰富消息的内容。实现文件的传输。程序分为客户端和服务器端。客户端可以使用不同的用户进行登录。账户可以增加或删除,并可以通过组织结构进行分组管理。

总体设计的程序分为客户端和服务器端,多个客户端可以连接同一个服务器,通信系统的拓扑结构为一个服务器链接多个客户端。服务器不但提供接受客户端的连接,还能够对账户进行管理。客户端主要实现相互之间消息的传递和文件的传输。

4数据库设计

数据库设计是指对于一个给定的应用环境,构造(设计)优化的数据库逻辑模式和物理结构, 并据此建立数据库及其应用系统,使之能够有效地存储和管理数据,满足各种用户的应用需求,包括信息管理要求和数据操作要求。目标为用户和各种应用系统提供一个信息基础设施和高效率的运行环境。

4.1 数据表的建立

服务器使用Access作为后台数据库,用来存储组织结构及账户信息,其中包含两张数据表。其中tb_Account表存储的账户信息。账户信息包括账号、姓名、密码、性别、年龄、部门、部门名称、职务、办公电话、手机、电子邮箱、联系地址和图片,组织结构表包含组织编号、组织姓名和上一级编号。

4.2 数据库操作流程

数据库操作流程如下:首先,引入数据库文件,其次,定义指针。其中执行的SQL语句如下:

CString sql = “select *from tb_Department where ParentID = 0”;

m_pRecord = m_pConnect->Execute(“select * from tb_Department where ParentID = 0”,0,adCmdText);

5 服务器端功能设计与实现

5.1 服务端主窗体设计

服务端可以对组织结构及账户进行管理,并提供通信服务,负责将组织结构信息和账户信息发送给客户端,验证账户的登录权限及检查客户端是否保持在线。服务器主窗体模块主要负责通信服务,并且可以调用组织信息管理模块和账户信息管理模块。服务器端主界面初始化步骤如下:

(1)在对话框初始化函数OnInitDialog()中,对数据库进行初始化,创建套接字并绑定本机IP地址和一个端口,然后开始监听,并将网络设置为异步通信。

(2)服务端创建两个端口,使用TCP进行数据传输,TCP是传输控制协议,是一种提供可靠数据传输的通行协议。它在网际协议模块和TCP模块之间传输,该协议允许两个应用程序建立一个链接,并在全双工方向上发送数据,然后终止连接,每一个TCP连接可靠的建立并完善地终止,在终止发生前,所有数据都会被可靠地传送。

5.2 服务端网络通信

通信模块分为两个部分。网络消息通讯和文件传输。对应的类为MFC框架中CSocket子类。本类重写了部分函数,用来处理通信相关逻辑。

5.3 服务端账户管理模块

账户管理模块主要完成向已建好的部门中添加部门成员。

(1)界面设计。在对话框中摆放控件。

(2)XML读写。树形列表用到了XML文件的操作。在程序中读写XML文件需要借助微软提供的接口,使用微软提供的XML接口的步骤包括:引入接口文件,创建接口,写入数据和读取数据。

5.4 服务端系统组织结构管理模块

服务端系统组织结构管理模块主要设计的步骤如下。

(1)窗体中的各控件属性设置包括添加、删除、组织结构、当前节点和组织名称。

(2)系统组织结构管理模块中的主要函数包括:对话框初始化函数、加载组织结构信息、加载指定节点下的子节点、单击树形结构某节点后的处理过程、添加组织和删除组织。

(3)设计函数从数据库表中读取组织结构信息,将组织结构信息添加到树形结构中,通过该函数查询出子节点数据。

(4)设计函数查询指定的ID节点的子节点数据,函数使用递归算法获取指定节点的所有子节点。

5.4 功能实现

(1)在对话框的初始化函数中进行初始化设置,并载入部门信息和账户信息。

(2)添加账户信息。该功能获取右侧输入区的数据,把数据插入数据库中,更新左侧树控件的显示。

(3)删除账号。该功能获取选中的账号,从树控件和数据库中删除该账号相关信息。

6客户端功能设计与实现

客户端开发有界面,能图形化反馈编程结果,所以比服务器端开发更“刺激”一些。因为和操作系统紧密结合,知识具有针对性,所以即使是做UI也比做前端的难度大些。现在做开发只是系统比较新且更新快,客户端开发的尽头就是熟悉了所有的API。然而API在演变,还得继续跟随。无论哪种系统,不断有API被标记为Deprecated,也有部分在新操作系统上不可用,需要在代码里判断操作系统版本或SDK的版本。

6.1 客户端登录模块

启动客户端应用程序后会提示用户进行登录,客户端登录模块主要负责向服务器发送登录信息,在登录窗体上需要用户输入服务器的IP地址和端口,以及登录账号和密码,如果服务器的IP地址和端口输入不正确就无法登录,登录账号和密码不正确也无法通过验证。

(1)登录功能实现

设计函数获取用户输入的信息,连接服务器,发送账号密码信息到服务器。

(2)自动登录功能实现

在对话框初始化的时候找到保存在本地的配置文件,从文件中读取登录信息。最后调用上面的登录函数登录服务器。

6.2 客户端主窗体模块

用户使用客户端登录服务器,然后和其他登录的用户进行通信。客户端主窗体模块是用户登录服务器后的界面,在主窗体界面中,主要有一个树形列表,树形列表中显示了所有的组织结构及结构下的成员。客户端主窗体的主要功能是接受服务器的消息、显示客户列表和客户状态等。客户端主窗体功能实现步骤如下。

(1)初始化函数

设计对话框初始化函数,该函数初始化了树控件要使用的图标,并启动定时器检测在线状态。

(2)加载部门信息

加载部门信息使用设计的函数,该函数提供给CClientSocket类调用,用于从XML文件中加载部门和账号信息。

(3)与指定的账号聊天

双击树控件中指定的用户时,弹出聊天窗口。此功能首先要查找是否存在与该账号聊天的窗口,若不存在,则创建一个新的聊天窗口。

6.3 客户端消息发送模块

会话流程设计阐述如下。当一个新用户通过自己的客户端登陆系统后,从服务器获取当前在线的用户信息列表,列表信息包括按照上述思路,设计系统会话流程如下:用户通过客户端进入系统,向服务器发出消息,请求登陆。服务器收到请求后,向客户端返回应答消息,表示同意接受该用户加入,并顺带将自己服务线程所在的监听端口告诉用户。客户端按照服务器应答中给出的端口号与服务器建立稳定的连接。服务器通过该连接将当前在线用户的列表信息传给新加入的客户端。客户端获得了在线用户列表,就可以独立自主地与在线的其他用户通信了。当用户退出系统时要及时地通知服务器。

登录到服务器后,就可以和在线用户进行通信了,发送消息模块就是实现消息和文件的发送。

(1)启动定时器

在对话框初始函数中启动定时器,作用是定时重回两个控件窗口。

(2)发送数据

在控件中输入消息或图片数据,单击发送会把数据发送给对方,同时显示在上方的控件中。

(3)发送图片

单击界面上的“发送图片”按钮,会打开一个文件浏览对话框,选中图片之后单击“打开”按钮,则图片被显示在聊天窗口中。此时,单击“发送”按钮,图片被发送给聊天的对方。

(4)发送文件

本部分功能使用单独的发送文件接口601,先打开文件浏览对话框,选择要发送的文件,然后连接服务器,发送文件传输要求,接着调用设计的函数发送文件。

7总结

该即时通信软件使用了多项技术。包括XML文件的读写,RichEdit控件中接口的使用,保存控件中的图片内容,在控件中显示超级链接,以及处理超级链接,使用事件进行线程同步,随机产生端口和建立TCP连接,消息的分包处理机制,ini文件中数据的读写,数据库的操作等。

8参考资料

[1]夏晓畅. 即时通信软件在中国办公自动化进程中的应用与分析——以QQ,微信和钉钉为例[J]. 领导科学论坛, 2021(3):6.

[2]李平英, 谷任峰, 黄从文. 一种基于即时通信软件的安全通信系统及其方法:, CN111490930A[P]. 2020.

[3]葛福鸿, 刘晓莹, 张丽萍. 基于Socket技术的即时通信软件的设计与实现[J]. 电脑开发与应用, 2011, 24(5):3.