精品聊天程序开发文档.docx
《精品聊天程序开发文档.docx》由会员分享,可在线阅读,更多相关《精品聊天程序开发文档.docx(12页珍藏版)》请在冰豆网上搜索。
![精品聊天程序开发文档.docx](https://file1.bdocx.com/fileroot1/2022-11/26/f7946ebb-0279-4096-9a7b-ca4835b199fc/f7946ebb-0279-4096-9a7b-ca4835b199fc1.gif)
精品聊天程序开发文档
南京理工大学
紫金学院
网络编程技术报告
作者:
学号:
学院(系):
计算机科学与技术
专业:
网络工程
题目:
多功能聊天程序
2013年12月
一、背景····································3
二、系统功能········································4
三、系统设计流程图····································5
四、系统模块划分·····································7
五、详细设计及实现··································9
六、总结体会········································19
一。
背景
网络聊天室通常直称聊天室,是一种人们可以在线交谈的网络论坛,在同一聊天室的人们通过广播消息进行实时交谈。
聊天室可以建立在即时通讯软件(如MSNMessenger、QQ)、P2P软件、万维网(如Halapo,Meebo)等基础上,万维网方式更为普通和种类繁多,交谈的手段不局限于文本,更包括语音、视频。
通常聊天室是按照房间或频道为单位的,在同一房间或频道的网人可以实时地广播和阅读公开消息.一般情况下,与其它网络论坛、即时通讯不同的是,聊天室不保存聊天记录。
1.1课题背景及意义
当今世界正处于信息时代,计算机和通信网络是这一时代所谓“信息基础设施”。
在互联网相当普及的今天,在互联网上聊天对很多“网虫"来说已经是家常便饭了.聊天室程序可以说是网上最简单的多点通信程序。
一个简单的聊天室,从程序员的观点来看就是在多个I/O端点之间实现多对多的通信。
基于SOCKET的局域网通信是一种灵活的、易于实现的、低成本的方法.它可以运行在各种使用TCP/IP协议作为通讯协议的网络上。
而在SOCKETAPI的帮助下,开发基于SOCKET的局域网通信软件也是易于实现的。
1.2实验平台介绍
VisualC++(简称VC)是Microsoft公司推出的目前使用极为广泛的基于Windows平台的C++可视化开发环境.VC基于C,C++语言,主要由是MFC组成,是与系统联系非常紧密的编程工具,它兼有高级,和低级语言的双重性,功能强大,灵活,执行效率高,几乎可说VC在 Windows平台无所不能。
VC主要是针对Windows系统,适合一些系统级的开发,可以方便实现一些底层 的调用。
在VC里边嵌入汇编语言很简单。
当对系统性能要求很高的时候,可用VC开发。
VC在多线程、网络通信、分布应用方面,有着不可比拟的优势。
1。
3可行性分析
本课程设计主要解决在客户端于客户端的信息交换和客户端于服务器的信息交换及服务器的信息处理上的管理的课程设计。
此程序主要分为两部分:
服务器端和客户端.服务器端用于提供一个网络端口,等待客户端发出请求,登录到此服务端,然后进行网络通讯和消息的转发;客户端可通过服务器端的IP地址发送连接请求,然后登陆聊天室。
在服务器端的成员列表栏中会显示在线的所有人名单,有人退出聊天室,成员列表会自动除名。
服务器端同时也提供了成员之间的私聊功能,此时服务器端作为一个转发站,进行消息的转发。
整个程序的主体使用了CSocket类的方法,实现了网络通讯聊天。
先启动服务器端聊天程序,这是聊天服务器需要指定一个端口号,客户端则根据这个端口号以及服务器的网络地址与服务器进行通信。
在这里,把端口号成为“聊天频道"。
在后面的程序代码分析中将看到,端口号并不等同于聊天频道,而是在聊天频道上增加一个固定的偏移值,使得这个聊天频道不会和系统保留的端口发生冲突。
服务器启动后将在这个指定的端口号中等待客户的连接.对于公共聊天室,服务器对客户的数目不做任何限制.而对于私人聊天室,每个聊天频道则只能允许两个客户互相连接,使得一方发送的信息只能到达对方的主机中.这里的服务器提供的是公共聊天服务。
通过分析发现,该程序完全可以通过VisualC++中MFC完成。
二.需求分析
2.1设计目的
综合运用本课程及计算机网络的相关知识设计并实现一个网络应用程序,以VisualC++作为开发平台,通过实践复习巩固课堂所学的理论知识,提高对所学知识的综合应用能力。
2.2设计要求
采用客户/服务器模式,分为客户端程序和服务器端程序。
服务器采用WINSOCKI/O模型中的任一种,支持多个客户同时在线聊天。
客户端程序和服务器程序通过网络交换聊天字符串内容,服务器窗口的列表框中显示当前在线用户,支持客户端之间的私聊(可以通过服务器中转,或考虑UDP打洞直接建立端端连接)。
课程设计要求设计并编程完成两个方面的内容:
首先建立一个使用TCP协议的聊天室服务器,这个服务器可以同时支持多个用户的在线聊天;其次设计一个可以和服务器通信的聊天室客户端。
2。
3功能要求
✧支持多个客户端的连接,在服务器和多个客户端之间进行数据传输;
✧接收客户端发送的消息,并显示在一个列表框中;
✧在用户连接上后有提示,显示出连接的用户名字;
发送信息时可以显示聊天的所有记录;
2.4系统主要功能和主要功能描述:
服务器端聊天程序必须能够做3件事情:
(1)服务器聊天程序要在待定的端口上等待来自聊天客户的连接请求,并且需要维护一个客户连接表,以记录所有成功的连接。
(2)服务器聊天程序要及时接受从各个聊天客户发送过来的信息,然后把这些信息转发到一个或多个客户连接。
对于公共聊天室,服务器将把接受到的信息向除源端外的所有客户发送过去。
服务器还要监控这些连接的状态,在客户主动离开或发生故障时从列表中删除相应的表项,并及时更新连接表。
这些要求可以通过CSocket类提供的功能实现。
从CSocket派生出两个类CListenSocket和CClientSocket,它们分别用来侦听客户的连接请求和建立与客户的连接。
服务器只需要一个侦听套接字CListenSocket,然后根据客户的连接请求动态创建客户套接字CClientSocket。
客户套接字的数量是不可预知的,因此需要一个列表来记录。
MFC的CPtrList类就能实现这种功能。
客户端聊天程序需要完成以下几个功能:
(1)客户端聊天程序要负责建立和维护与服务器的连接,通过获取用户的设置尝试与服务器的连接,并且随时检测连接的状态。
(2)客户端聊天程序要把用户输入的信息及时发送到聊天服务器。
一般情况下,当用户输入一行信息并且按下回车键后聊天程序就要把这一行信息发送出去,才能及时地满足用户的交互需求。
(3)要随时准备好接受来自服务器的信息,随时把接受到的信息显示出来,让用户及时看到对方的响应。
在用户退出聊天过程是要关闭与服务器的连接。
比较好的做法是提前通知服务器或者直接给服务器发送一条退出通知,使得服务器能够及时掌握客户端的连接状态,把对方客户的退出信息及时发送到对等实体上。
客户端聊天程序需要使用一个通过CSocket类派生出来的CChatSocket类来实现。
该套接字用来发送一个与服务器的连接请求和维持与服务器的连接,发送和接收聊天信息,完成上述各项功能。
三.设计流程图
根据对用户的要求及功能设置可以得到以下的流程图,用户首先启动客户端,登陆服务器并向服务器发送信息,启动服务器,服务器等待客户要求并向客户反馈在线用户信息,用户向服务器发送信息,服务器处理用户的数据,然后用户开始聊天。
客户端的聊天分为对所有人的信息和私聊的信息,该信息应通过程序控制分别进行处理。
三.系统模块划分
图1.系统模块划分图
服务器端:
服务器等待用户从主窗口发来的启动和接收消息的过程如下:
首先,建立自己的套接口。
在互联网的进程通信中,全局标识一个进程需要一个被称为“半相关”的三元组(协议,本地主机地址和本地端口号)来描述;而一个完整的进程通信实例,则需要一个被称为“相关”的五元组(协议,本地主机地址,本地端口号,远端主机地址和远端端口号)来描述。
s_sockfd=socket(AF_INET,SOCK_STREAM,0),该函数建立指定格式,数据类型和协议下的套接口。
地址格式为AF_INET(唯一支持的格式);数据类型SOCK_STREAM表示建立流式套接口;第三个参数为0,即协议缺省。
Bind(s_sockfd,(structsockaddr*)&server,sizeof(server)),该函数建立服务器本地的半相关。
其中,server是sockaddr_in结构,其成员描述了本地端口号和本地主机地址,经过bind()将服务器进程在网上标识出来。
然后建立连接,先是调用listen()函数表示开始侦听,再通过accept()调用等待接收连接。
Listen(s_sockfd,2)表示连接请求队列长度为2,即允许有两个请求。
若有多于两个请求,则出现错误,给出错误代码。
ns=accept(s_sockfd,(structsockaddr*)&chent,&namelen),accept()阻塞缺省等待请求队列中的请求,一旦有连接请求来到,该函数就建立一个和s有相同属性的新的套接口.Client也是一个sockaddr_in结构,连接建立时填入请求连接的套接口的半相关信息。
然后,就可以接收和发送数据了。
recv(ns,buf,1024,0),send(ns,buf,pktlen,0)上面两个函数分别负责接收和发送数据。
recv从建立连接的套接口ns接收数据放入buf中;send则将buf中数据发送给ns。
至于第四个参数,表示该函数调用方式,可选择NSG_DONTROUTE和MSG_OOB,0表示缺省。
最后,关闭套接口。
客户端:
客户端等待用户从主窗口发来的发送命令.一旦接收到发送数据请求,首先调用WSAStartup()函数,初始化WindowsSocketDLL,并检查版本号:
Status=WSAStartup(VersionReqd,lpmyWSAData);其中,VersionReqd描述了WinSock的版本;lpmyWSAData指向一个WSADATA结构,该结构描述了WindowsSockets的实现细节。
WSAStartup()之后,进程通过主机名获取主机地址:
四.Hostaddr=gethostbyname(server_address);Hostaddr指向hostent结构,然后,进程就不断地消息循环,等待用户通过菜单选择启动。
这时,通过调用Clinent(t)来启动套接口.在Clinent(t)中,首先也是调用socket()来建立套接口,为建立连接,必须立刻调用connect(),进程发出连接请求后就不管了。
当连接建立好后,WINSOCKDLL自动发出一条消息给窗口函数,使程序运行下去。
Connect(s_sockfd,(structsockaddrFAR*)&dst_addr,sizedlf(dst_addr));窗口函数在收到UM_SOCK消息后,判断是由哪个网络事件引起的。
第一次,必然是由连接事件引起的,这样,就会执行相应的程序,同样调用WSAASyncselect()来提名DWRITE事件,希望在套接口可发送数据时接收消息.在收到FD_WRITE消息时,先调用send()发送数据,在调用WSAASyncselect()来提名FD_READ事件,希望在套接口可接收数据时收到消息,在收到FD_READ消息时,先调用recv()来接收数据,再提名FD_WRITE事件,如此循环下去,直到发生外部事件FD_CLOSE。
这时就调用WSAAsyncselect(s,hwnd,0,0)来停止异步选择。
在窗口函数接收到WM_DESTROY消息时,先调用closesocket()来关闭套接口,再调用WSACleanup()终止WindowssocketsDll,并释放资源
五.
六.详细设计及实现
1.客户端
1。
1用户登录模块设计
BEGIN_MESSAGE_MAP(CMainBordApp,CWinApp)
ON_COMMAND(ID_HELP,CWinApp:
:
OnHelp)
END_MESSAGE_MAP()
CMainBordApp:
:
CMainBordApp()
{
}
CMainBordApptheApp;
BOOLCMainBordApp:
:
InitInstance()
{
if(!
AfxSocketInit())
{
AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
returnFALSE;
}
AfxEnableControlContainer();
#ifdef_AFXDLL
Enable3dControls();
#else
Enable3dControlsStatic();#
endif
CMainBordDlgdlg;
m_pMainWnd=&dlg;
intnResponse=dlg.DoModal();
if(nResponse==IDOK)
{
}
elseif(nResponse==IDCANCEL)
{
}returnFALSE;
}
1.2登陆后
1.3客户端发送消息
下图是私聊时的界面
1。
4文件传送
1.5语音聊天
七.总结体会
该次课程设计的制作我主要是参照了图书馆内的相关书籍,找到一个类似的程序,然后按照书上的内容一步步的做出来了,虽然这个程序算不上是我自己写出来的,但通过这样的一个过程,还是让我学会了很多东西,也算能比较熟练地掌握MFC这一个软件了,这算是一个不小的收获吧,而且,在做这个程序的过程中,让我认识到了在做这样程序中,遇到解决不了的问题与同学的讨论时很重要的,譬如可以以运行,但是就是无法出现连接的显示和状态。
最后与同学讨论后,才知道是服务器端有了错误,没有设置自己的IP地址,然后对于客户端进行了一番修改,才终于出现了上述的结果。
虽然没有彻底做的出来,但是还是比较开心的,因为自己知道了哪里不足,哪里不可以,可以在以后多多的做练习来充实自己。
在课程设计过程中,收获知识,提高能力的同时,我也学到了很多人生的哲理,懂得怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。
因此在以后的生活和学习的过程中,我一定会把课程设计的精神带到生活中,不畏艰难,勇往直前!
我以后还是需要多多的练习,多多的勤奋,这样才有可能让自己有信心,有动力,让自己不至于懂的太少而怯场,因为不懂而不会做,相信自己以后会编写出让自己满意的程序和软件的。