基于TCPIP的网络聊天工具设计说明

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

基于TCP/IP的网络聊天工具设计
【摘要】本系统是实现在局域网内多人在线聊天的聊天工具,主要是采用套接字的原理进行编程,将Visual C++6.0作为开发平台,并结合使用VC++中的开发框架MFC。

系统是在TCP/IP网络环境下,采用客户机/服务器的模式进行设计,将各任务合理的分配到服务器和客户端,在很大程度减少系统资源的消耗以及通信的开销。

该聊天工具主要是设计成类似QQ群的聊天室,其中服务器是接收并处理来自客户端的消息,客户端主要是实现申请新账号、进入聊天室、聊天室内的群聊、用户间的私聊、发送和接收离线消息等主要功能。

本文主要针对系统的研究现状、研究目标、开发过程等进行说明,并对各个模块的设计流程进行详细分析。

【关键词】TCP/IP,Winsock网络编程,客户机/服务器模式,聊天工具
Design for the Network Chatting Tool Based on TCP/IP 【Abstract】:The system is a network chat tool which could make multiuser communicates on line. The system is mainly use the socket principal to program. The program platform is VC++6.0 which has much function. And MFC class library is combined to make the system’s function come true. The Server and Client has the task on their’ own which is a wonderful network model can reduce the consumption of system. The chat tool is designed to be similar with QQ group where Server receives and deals with the datagram from Client. And the Client achieves the target. Such as register, log in, send and receive datagram and so on. The paper is mainly to explain the research status and program process. And then it also emphasizes on the design method of every block.
【Keyword】:TCP/IP, Winsock program,Client/Server,Chat Tool
目录
第一章引言 (1)
1.1聊天系统的研究现状 (1)
1.2 聊天系统的开发目标 (1)
1.3 聊天系统的开发意义 (2)
1.4 论文的主要内容 (2)
第二章开发工具和关键技术 (3)
2.1 开发工具 (3)
2.2 TCP/IP协议 (3)
2.3 客户机/服务器模式 (4)
2.4 套接字网络编程 (5)
2.4.1套接字简介 (5)
2.4.2 TCP套接字的应用 (6)
2.5 MFC(Microsoft Foundation Class) (7)
2.5.1 MFC简介 (7)
2.5.2 MFC类库 (8)
第三章、系统设计 (9)
3.1设计原理 (9)
3.2 系统总体功能结构 (10)
3.3 建立类模型 (11)
3.3.1服务器端类 (11)
3.3.2 客户端类 (13)
第四章系统模块详细设计 (15)
4.1服务器模块 (15)
4.2 客户端模块 (15)
4.2.1注册模块 (15)
4.2.2登陆模块 (15)
4.3 文字聊天模块 (16)
4.3.1私聊模块 (16)
4.3.2群聊模块 (16)
第五章系统测试 (17)
5.1 测试目的 (17)
5.2 测试内容与结果 (17)
5.2.1服务器测试 (17)
5.2.2 单元模块测试 (18)
5.2.3系统评价: (23)
第六章总结 (24)
6.1毕业设计的总结 (24)
6.2 经验和感想 (24)
致谢.................................................. 错误!未定义书签。

参考文献 (25)
第一章引言
1.1聊天系统的研究现状
在高速发展的信息时代,人们有众多的通讯手段[1]。

比如电话、手机、邮箱等。

每个工具都存在不完善的地方,比如邮箱存在实时性的问题,手机、电话等在通信的过程中不能实现一对多的聊天。

因此为了填补这个漏洞,开发出网络聊天工具是至关重要的。

如今网络聊天工具的发展也逐渐形成规模,它不仅价格便宜、通讯迅速,且能同时与多位好友进行在线聊天。

近几年来,网络聊天工具有了更为广阔的市场和前景。

据科学统计,截止2009年,在网络聊天工具的使用方面,全球已经达到十亿的用户量,账号的申请量为25亿,我国在该方面的使用数据也在不断增长,截止2013年,我国的使用量为4.68亿,其年增长率为12.7%[2]。

网络聊天工具在广域网上具有较为成熟的技术,在开发的过程中,会调用多种协议,但是使用的核心协议是TCP协议或UDP协议。

比如国外产品ICQ、MSN、Yahoo通等,国内产品QQ、飞信、新浪UC等。

在使用方面,这些工具都各具特色,除了聊天功能,都存在一些增值功能。

但是这些产品的开发过程是作为商业机密处理,因此对其编程机制等是很难了解到的。

不过从宏观的角度出发,聊天工具之间能够通信都是因为有通信接口的存在,且在开发过程中,调用TCP/IP 协议实现相应的功能。

而相比来说,局域网的功能实现难度较低,且其存在的网络结构并不是很复杂,因此讨论局域网的聊天工具也是具有一定的研究价值。

1.2 聊天系统的开发目标
本次设计主要是建立在MFC封装下的CSocket网络编程以及TCP/IP协议的基础上,实现局域网内的多人在线聊天。

该系统是以QQ群为开发模型。

在该方案中,是以Visual C++ 6.0为开发平台,利用MFC类库,结合套接字的形式,并以对话框的形式进行输入和显示,最终实现了通过服务器中转的文字聊天。

在客户端功能模块设计中,存在注册模块、登陆模块、私聊模块、群聊模块以及收发离线消息的模块。

1.3 聊天系统的开发意义
该聊天系统主要是为了保证在局域网环境下,多位用户之间能够有一个共同的平台进行在线聊天,并且能够选择特定好友进行私聊。

虽然该系统消耗的系统资源较少,使用简单的网络结构,但是它可以为企业提供一种安全、快速、有效的通信平台,局域网也不会因为聊天系统间的工作增加过多的负荷,且其存在的各种通信需求能够得到相应的处理。

在具体实现中,企业无需对局域网硬件做出任何改动,就可以使用局域网聊天系统带来的通信机制。

局域网聊天系统的开发实例有多种,其中以Socket套接字作为网络编程接口来开发局域网聊天软件是最为广泛的应用方式,能够处理传统通信中遗留下来的通信问题,并不断适应新型的网络应用[3]。

例如在企业内部,套接字通信原理可以很好的应用在教育、娱乐、通信等方面。

且采用套接字原理通信的方式在信息的发送和接收方面有较快的速度,在网络带宽方面占用较少的资源,在服务器的吞吐能力方面存在较低的值,能够在最大程度上保证通信的信息安全。

1.4 论文的主要内容
本次聊天系统设计的重点是通信功能。

在功能方面,主要是保证用户可以注册号码,登陆界面,进行私聊、群聊,并且能够发送和接收离线消息。

在窗口方面,采用卡通人物进行界面美观,保证系统的人性化设计。

下面将对各章节内容进行综述。

第1章是对本系统的研究现状、开发的意义等进行了深入的阐述。

第2章是介绍在开发过程中所运用到的相关技术。

例如TCP/IP协议、Socket 编程技术,MFC类库、客户端/服务器模式等[4]。

第3章是系统的总体设计。

将对系统的设计流程进行一定程度的分析,绘制出系统的总体功能结构图,并对程序代码中使用到的函数类及成员函数进行介绍。

第4章主要是对系统的各个部分设计进行分析。

第 5 章介绍系统测试。

主要是保证系统能够正常运行,并实现预期设定的功能[5]。

第二章开发工具和关键技术
2.1 开发工具
根据系统的用户需求以及总体的设计思路,为了能够在最大程度上发挥系统的性能,同时也为了能够在一定程度上实现系统的高可移植性,需要选择一个适当、有效的开发工具。

本次设计整体以Visual C++6.0为开发平台,该平台是一个非常强大且完善的程序开发环境,存在众多辅助开发工具。

比如编译器、向导类等。

它是一个以Windows操作系统作为平台基础的集成环境[6]。

在系统开发的过程中,使用了MFC封装下的CSocket套接字进行编程。

该方式可以在很大程度上降低网络编程的难度。

2.2 TCP/IP协议
TCP/IP也被称作传输控制协议/网际协议,作为网络互连的核心协议,受到广泛的应用。

该协议类型作为开放性的标准应用在各种计算机中,在一定程度上保证系统间通信的正常运行。

在计算机网络中,TCP/IP协议将对网络地址进行统一分配,保证每台计算机系统都存在独特的地址。

TCP/IP协议不仅仅只有TCP 和IP协议,它包括一百多个协议,其中属于核心协议的是传输层协议、物理接口层以及网络层协议[7]。

其他协议也在网络中发挥各自的作用,如ICMP协议。

TCP和UDP协议作为核心协议,自然存在其优势的地方。

TCP也称作传输控制协议,主要是传输数据流[8]。

它是通过面向连接的方式,使用校验、确认信息等形式实现数据的传输。

因此该协议具有一定的可靠性。

在具体的功能实现中,主要是利用三次握手和滑动窗口的机制来控制流量,从而保证传输的可靠性。

相比之下,用户数据包协议UDP属于不可靠协议。

在传输数据的过程中,不能保证信息的正确传输,即时传输失败,也不会向对方发送通知。

这是一项简单的传输层协议,因此UDP协议的数据包包头的字节数较少,存在较少的负载。

在实际的网络编程中,用户是通过操作系统核外的应用程序进行编程[9]。

编程的核心是套接字的运用。

2.3 客户机/服务器模式
客户机/服务器方式是用户和编程者都很熟知的网络结构,在TCP/IP环境下,主要是运用该模式进行网络编程。

它主要是对网络程序的一种运行方式进行描述,能够实现网络用户间的相互沟通。

在该模式下,计算机系统的硬件环境能够很好的发挥其长处,并保证客户端以及服务器都有适当的任务,将原有的通讯开销降至一定水平。

客户端和服务器是通过主动请示达到发送消息的目的。

客户端首先是向服务器发送请求消息,并等待响应结果。

而服务器会对用户端的信息做出判断和应答。

在具体的操作过程中,先启动服务器。

服务器通过消息响应函数完成一系列操作。

具体过程如下:第一,服务器首先创建套接字,打开与客户端通信的渠道。

表示服务器处于愿意接受数据的状态;第二,服务器创建监听套接字,侦听客户端的请求消息[10];第三,对接收到的数据做出消息响应,向客户端发送消息处理结果或是将数据存储到缓冲区中。

第四,回到第二个步骤,继续进行监听动作。

第五,关闭服务器。

在整个过程中,客户端主要进行以下几个操作:第一,将与服务器通信的端口打开,并成功连接到服务器;第二,将请求内容通过套接字端口发送给服务器,并等待服务器发回的处理消息。

第三,客户端在结束与服务器的通信后,要关闭通信端口。

客户端与服务器的工作关系图如图2-1所示[11]。

图2-1 客户端/服务器通信结构示意图
2.4 套接字网络编程
2.4.1套接字简介
Socket又称作套接字,从基本概念上分析,它主要包含IP地址以及Port 端口号。

在一定协议条件下,只要利用Socket套接字就可以实现计算机系统间的信息发送和接收。

换句话说,即两个应用程序可以通过套接字进行相互连接。

在客户机/服务器模式中,为了实现简单的网络编程,微软公司在90年代与其他家公司配合制定出一套通用的套接字规范,用于Winsock网络编程。

在使用Winsock网络编程过程中,会结合多项协议。

而其中应用最广泛的是TCP/IP协议。

应用进程间的相互通信主要是利用Winsock规范中的API,为了更进一步降低网络编程的难度,将Winsock实现具体功能的API进行封装,形成MFC Socket。

编程过程中调用的是MFC封装后的套接字类,如CSocket[12]。

如今网络开发应用中最为广泛使用的应用程序接口就是Socket接口,在实际的操作系统调用以及通信协议实现功能中,主要是采用图2-2的层级关系。

图2-2 套接字实现通信的层级关系图
2.4.2 TCP套接字的应用
本次设计的聊天室主要是运用TCP套接字来实现信息传输,TCP协议是采用面向连接的方式[13]。

因此在C/S模式下,要保证服务器与客户端连接后,才能进行信息传输。

在双方通信的过程中,服务器采用以下几个步骤来使用套接字接口:第一,使用Socket()函数创建服务器端通信的套接口,如果没有成功创建套接字端口,就无法继续执行;第二,将服务器的地址与所创建的套接口进行结合的过程中,要使用Bind()函数完成[14]。

该函数不仅确定本地的IP地址,还能绑定Port端口号。

如果采用Create()函数进行,前两步将并为一步。

即不采用Bind()函数;第三,服务器利用Listen()来侦听请求消息,并打开通道准备接收;第四,当客户端发来信息后,服务器调用Accept()函数,并新创建一个套接字,来重载Revc()函数,从而达到接受数据的目的;第五,服务器如果要发送应答消息给客户端,主要采用Send()函数;第六,最后停止套接口的使用,即调用CloseSocket()。

在这个过程中,客户端主要进行以下的步骤:第一,通过Create()函数,在客户端创建一个套接字;第二,客户端与服务器的连接通过Connect()函数来实现;第三,实现连接后,使用Send()函数发送消息。

或者是加载Recv()函数接收消息;第四,使用CloseSocket()停止套接字接口的使用。

整体的TCP 套接字运用流程如图2-3所示。

服务器方
图2-3 C/S 模式下TCP套接字运用流程图
2.5 MFC(Microsoft Foundation Class)
2.5.1 MFC简介
在VC++环境中,存在一个函数框架MFC,利用MFC类库可以在一定程度上降低网络编程的难度。

它是依附在标准的软件开发平台VC++下的辅助软件开发包,与VC++关系密切。

网络编程也因为MFC类库的存在变得更加简单。

它能够为许多应用程序提供函数模型[15]。

同时VC++内部具有许多支持网络编程的东西,例如存在类向导,能够自动生成一些简单的程序,甚至是文档服务器等复杂的程序,可以在很大程度上减少软件开发的时间。

在整个Windows家族中,MFC能够很好的与各项开发工具进行兼容,其消息映射机制能够在一定程度上减少虚函数表的数量。

2.5.2 MFC类库
传统的C语言更多的是对Widows API进行直接调用,而封装后的MFC类库是对原有的C++层次进行拓展。

内部已经存在多种标准的样板文件代码,主要是应用在C编写的Windows程序中。

因此,MFC类库主要是提供网络编程的框架,让网络编程更易实现,而且其性能并没有受到损失。

比如,4.0的版本中就存在200个不同的类,但是在实际的程序编写中,只会应用到十多个不同的类,根据这些类就可以编写出很完善和漂亮的程序。

MFC结构主要存在以下几种类别:一是,Cobject基类。

该类主要是作为大多数派生类的基类,其中CAsyncsocket类是从该类派生出来的。

它主要对Windows Socket的API进行封装,但是封装级别较低[16],而CSocket是继承了CAsyncsocket,在比较高的层次封装Windows socket的API;二是,MFC应用结构类。

该类主要是对一个整体的函数模型进行构造,能够在很大程度上为许多应用程序提供通用的功能,编程者可以在对应的框架上写出所要求的功能;三是,窗口、对话和控件类。

类Cwnd能够被自己使用,也是许多派生新类的基类,它与它的派生类共同封装了Hwnd,Cwnd是一个Windows窗口,其中存在的各项窗口是由Cwnd的派生类来表示;四是,文件和数据库类。

这些类是表示能够在一个数据库或是磁盘文件中存储相关信息,其中DAO以及ODBC主要是实现访问数据库的功能;五是,MFC的层次结构上也存在一些简单的数据库类型类、数据列表、调试类等。

第三章系统设计
3.1设计原理
该聊天室的设计是在TCP/IP协议的支持下。

网络编程分成两部分进行,即服务器与客户机。

在设计的过程中,主要是采用TCP面向连接的方式并结合Socket套接字,实现通信[17]。

在代码设计中,服务器端主要是由CSocket派生出两个新类,取名CServerSocket和ClientSocket。

客户端中的CClientSocket也是由CSocket 派生出来。

服务器的CServerSocket为监听套接字,当客户端发来的消息被服务器侦听到时,将加载OnAccept函数,并新建一个通信套接字。

而客户端的通信套接字CClientSocket主要是用于与服务器建立通信套接字,发送注册、登陆等命令字[18]。

在操作流程的设计中,首先是将服务器端启动,客户端输入昵称和密码,将连接请求发送给服务器,服务器响应客户端的登陆请求,并更新聊天室的用户列表。

此时用户间可以进行文字聊天。

且如果选择用户列表中的用户进行私聊,假设此时用户不在线。

那么该离线消息同样会发到服务器,由服务器保存。

等到用户上线提取离线消息时,由服务器端转发出去。

同样客户端要实现多人在线聊天的功能,保证聊天室的正常运行。

其实现的基本功能如图3-1所示。

图3-1基本功能流程图
3.2 系统总体功能结构
由客户端程序界面可知,该聊天工具包含以下主要功能:用户注册;用户登录;发送和接收私聊信息;发送和接收群聊消息;发送和接收离线消息。

由服务器端程序界面可知,服务器实现监听数据、连接客户端、查询并记录数据到数据库、发出应答消息等功能。

最终实现的是更新用户列表,显示在线用户和离线用户,作为客户端的中转站,转发客户端的消息,保证客户端的通信顺利进行。

根据系统的要求,画出功能模块图3-2所示:
图3-2系统总体功能结构
服务器端模块 聊天工具
客户端端模块
建立连接 监听客户 数据处理 用户注册 用户登录 信息通信
私聊模块 群聊模块 离线消息
3.3 建立类模型
3.3.1服务器端类
3.3.1.1类的识别和功能
第一,CChatServerAPP类。

服务器应用程序类。

通过该类实现服务器程序的初始化,且创建监听套接字,开启服务器服务。

第二,CServerSocket类。

用来侦听客户的连接请求,调用OnAccept函数来接收客户端的登录请求。

第三,CChatServerDlg类。

服务器窗口类,是服务器主对话框的界面,主要是操作数据库。

完成服务器离线列表的初始化。

对用户的上线、离线进行记录,并更新服务器端以及客户端的在线、离线列表。

保存离线消息,并对请求离线消息的命令字进行处理。

第四,CClientSocket类。

通信套接字类,该类主要接收客户端的消息,并重载OnReceive函数,判断消息类型后,对各项消息内容进行处理,并将处理结果发给客户端。

3.3.1.2主要的类成员函数及其功能
在MFC封装下的CSocket网络编程中,在服务器端的程序中主要设置了以上几种类别,在各类中,定义了类成员函数,用于消息响应。

其类成员名字及功能如表3-1所示。

表3-1 服务器主要的类成员函数及其功能
3.3.2 客户端类
3.3.2.1类的的识别和功能
第一, CMyChatAPP类。

客户端应用程序类。

该类主要是创建套接字对象指针ClientSocket、登陆窗口指针、聊天窗口指针,并动态分配套接字,响应用户在窗口的操作后,会及时销毁套接字。

第二, CAskDlg类。

用户注册类。

保证用户注册窗口的正常运行,将用户的注册信息发往服务器。

服务器将此消息保存到数据库中。

第三,CLoginDlg类。

用户登陆类。

保证用户登陆窗口的正常运行。

将用户登陆的昵称、密码等信息发往服务器。

服务器对其发来的信息与数据库的信息进行对比判断,并做出响应。

第四, CMyChatDlg类。

聊天窗口类。

提供用户文字聊天窗口界面,把用户的群聊信息、各控件命令字等发送给服务器,并接受服务器发来的应答消息,更新离线以及在线用户列表,更新聊天内容。

第五, CLeave类。

查看离线消息类。

该类主要实现在编辑框中显示离线消息。

第六,CPrivate类。

私聊信息类,该类主要完成私聊信息内容、用户名、时间的发送。

3.3.2.2 主要的类的成员函数及其功能
在客户端的程序中主要设置了以上几种类别,在各类中,定义了类成员函数,用于消息响应。

其类成员名字及功能如表3-2所示。

表3-2 客户端主要的类成员函数及其功能
第四章系统模块详细设计
4.1服务器模块
服务器模块有初始化界面,程序编译成功后,服务器的消息显示框中会显示“服务器初始化成功”。

在这个过程中,会不断等待用户端的消息,并做出消息响应。

比如当客户端有用户登录请求,服务器处理数据成功后,会在显示框中显示用户进入聊天界面的提醒。

并且会对服务器以及客户端的在线列表、离线用户列表进行更新。

4.2 客户端模块
4.2.1注册模块
用户要进入该聊天室,需要先进入客户端的注册模块,向服务器注册一个账号。

服务器返回该账号注册成功的消息后,用户以后才能利用该账号进出聊天室。

在程序编译成功后,会有一个登录窗口出现。

如果用户有相应的账号,可以输入正确的信息进入聊天界面。

如果没有,要点击申请新号的相关按键,程序会弹出注册窗口。

在注册窗口,用户输入系统需要的相关信息后,要点击“确定”按钮。

如果输入空的字符,则弹出提示框,要用户重新输入。

如果操作正确,注册模块会将昵称、密码等信息,通过套接字端口发送给服务器请求注册一个新用户。

服务器收到客户端发来的消息后,首先判断消息类型。

判断得知是申请账号的命令字,就将用户账号、密码等信息插入到数据库。

并给客户单返回一个独特登陆号,作为用户的账号。

客户单从服务器端接收到注册成功的消息后,在登陆界面中填写信息,进入聊天窗口。

4.2.2登陆模块
登陆对话框的设计主要是对客户身份的合法性进行检验。

如果是非法的用户,将无法进入聊天界面。

其设计算法如下:当客户端程序编译成功时,将出现登陆界面。

用户将昵称和密码输入到登陆对话框的编辑框内,并确认登陆。

如果输入空字符,会弹出输入有误的提示框。

如果输入正确,登陆模块会将用户输入的信息通过套接字端口发送给服务器,并等待服务器的回应。

服务器重载OnReceive函数,判断消息类型,得知是用户登陆或退出的信息,查询数
据库,通过昵称得到密码,并检索记录,判断密码的正确性。

如果密码输入无误,就对客户端做出消息响应。

并且会在服务器的消息列表内显示,有客户端成功登陆。

同时更新客户端以及服务器端的在线用户列表[19]。

如果账号或密码有误,会提示无法登陆。

用户成功登陆后,会进入聊天室界面,并且在该主界面会得到服务器发来的新更新的好友列表,会在离线用户列表以及在线用户列表中显示好友状态。

4.3 文字聊天模块
4.3.1私聊模块
4.3.1.1发送和接收在线消息
用户在在线好友列表中选择一个好友作为聊天对象,双击该好友,用Getcursel函数设置某个列表项为选中项,得到该好友的文本信息后,会弹出用户聊天窗口,并且发送私聊命令字给服务器,由服务器中转。

服务器得到私聊请求后,遍历用户套接字链表,并将消息发给所对应的用户。

被请求私聊的客户端,会弹出一个对话框[20]。

显示是否愿意与对方聊天。

如果确定,双方将进行聊天。

在这个过程中,服务器作为中转站,转发客户端的消息。

4.3.1.2发送和接收离线消息
如果用户在离线用户列表中选择一个好友作为聊天对象,双击该好友后,同样用Getcursel函数设置某个列表项为选中项,得到该好友的文本信息后,会弹出一个窗口,提示“您要对话的用户已离线,该消息将作为离线消息发送”,发送离线消息的命令字以及离线消息内容也会发给服务器。

服务器收到该数据后,会存储到缓冲区中。

等到离线用户登录后,点击“接收离线消息”按钮,会将本机昵称及命令字发给服务器,服务器会在数据库中检索记录,找到匹配消息后发送给在线用户。

4.3.2群聊模块
用户在聊天室的消息编辑框中,将消息编辑好后,点击发送按钮,会调用MyChatDlg 的OnSend()函数,向服务器发送消息的结构体、命令字、长度、当前时间、时间格式、昵称等,服务器接收到客户端发来的数据后,会判断消息类型,并转发给所有在线用户。

在聊天室的消息列表框中会出现服务器转发来的消息。

相关文档
最新文档