版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、南 京 理 工 大 学紫金学院网络编程技术报告作 者:学 号:学院(系):计算机科学与技术 专 业:网络工程 题 目:多功能聊天程序 2013 年 12 月目 录一、背景····································
2、;3二、系统功能········································4三、系统设计流程图·······
3、·····························5四、系统模块划分···················
4、83;·················7五、详细设计及实现·······························
5、;···9六、总结体会········································19一. 背景 网络聊天室通常直称聊天室,是一种人们可以在线交谈的网
6、络论坛,在同一聊天室的人们通过广播消息进行实时交谈。聊天室可以建立在即时通讯软件(如MSN Messenger、QQ)、P2P软件、万维网(如 Halapo,Meebo ) 等基础上,万维网方式更为普通和种类繁多,交谈的手段不局限于文本,更包括语音、视频。通常聊天室是按照房间或频道为单位的,在同一房间或频道的网人可以实时地广播和阅读公开消息。一般情况下,与其它网络论坛、即时通讯不同的是,聊天室不保存聊天记录。1.1课题背景及意义当今世界正处于信息时代,计算机和通信网络是这一时代所谓“信息基础设施”。在互联网相当普及的今天,在互联网上聊天对很多“网虫”来说已经是家常便饭了。聊天室程序可以说是网上
7、最简单的多点通信程序。一个简单的聊天室, 从程序员的观点来看就是在多个I/O端点之间实现多对多的通信。基于SOCKET的局域网通信是一种灵活的、易于实现的、低成本的方法。它可以运行在各种使用TCP/IP协议作为通讯协议的网络上。而在SOCKET API的帮助下,开发基于SOCKET的局域网通信软件也是易于实现的。1.2 实验平台介绍Visual C+(简称VC)是Microsoft公司推出的目前使用极为广泛的基于Windows平台的C+可视化开发环境。VC基于C,C+语言,主要由是MFC组成,是与系统联系非常紧密的编程工具,它兼有高级,和低级语言的双重性,功能强大,灵活,执行效率高,几乎可说V
8、C在 Windows平台无所不能。VC主要是针对Windows系统,适合一些系统级 的开发,可以方便实现一些底层 的调用。在VC里边嵌入汇编语言很简单。当对系统性能要求很高的时候,可用VC开发。VC在多线程、网络通信、分布应用方面,有着不可比拟的优势。1.3 可行性分析本课程设计主要解决在客户端于客户端的信息交换和客户端于服务器的信息交换及服务器的信息处理上的管理的课程设计。此程序主要分为两部分:服务器端和客户端。服务器端用于提供一个网络端口,等待客户端发出请求,登录到此服务端,然后进行网络通讯和消息的转发;客户端可通过服务器端的IP地址发送连接请求,然后登陆聊天室。在服务
9、器端的成员列表栏中会显示在线的所有人名单,有人退出聊天室,成员列表会自动除名。服务器端同时也提供了成员之间的私聊功能,此时服务器端作为一个转发站,进行消息的转发。整个程序的主体使用了CSocket类的方法,实现了网络通讯聊天。 先启动服务器端聊天程序,这是聊天服务器需要指定一个端口号,客户端则根据这个端口号以及服务器的网络地址与服务器进行通信。在这里,把端口号成为“聊天频道” 。在后面的程序代码分析中将看到,端口号并不等同于聊天频道,而是在聊天频道上增加一个固定的偏移值,使得这个聊天频道不会和系统保留的端口发生冲突。 服务器启动后将在这个指定的端口号中等待客户的连接。对于公共聊天室,服务器对客
10、户的数目不做任何限制。而对于私人聊天室,每个聊天频道则只能允许两个客户互相连接,使得一方发送的信息只能到达对方的主机中。这里的服务器提供的是公共聊天服务。 通过分析发现,该程序完全可以通过Visual C+中MFC完成。二需求分析2.1 设计目的综合运用本课程及计算机网络的相关知识设计并实现一个网络应用程序,以作为开发平台,通过实践复习巩固课堂所学的理论知识,提高对所学知识的综合应用能力。2.2 设计要求 采用客户/服务器模式,分为客户端程序和服务器端程序。服务器采用WINSOCK I/O模型中的任一种,支持多个客户同时在线聊天。客户端程序和服务器程序通过网络交换聊天字符串内容,服务器窗口的列
11、表框中显示当前在线用户,支持客户端之间的私聊(可以通过服务器中转,或考虑UDP打洞直接建立端端连接)。课程设计要求设计并编程完成两个方面的内容:首先建立一个使用TCP协议的聊天室服务器,这个服务器可以同时支持多个用户的在线聊天;其次设计一个可以和服务器通信的聊天室客户端。2.3 功能要求² 支持多个客户端的连接,在服务器和多个客户端之间进行数据传输;² 接收客户端发送的消息,并显示在一个列表框中;² 在用户连接上后有提示,显示出连接的用户名字;² 发送信息时可以显示聊天的所有记录;2.4 系统主要功能和主要功能描述:服务器端聊天程序必须能够做3件事情:(
12、1) 服务器聊天程序要在待定的端口上等待来自聊天客户的连接请求,并且需要维护一个客户连接表,以记录所有成功的连接。(2) 服务器聊天程序要及时接受从各个聊天客户发送过来的信息,然后把这些信息转发到一个或多个客户连接。对于公共聊天室,服务器将把接受到的信息向除源端外的所有客户发送过去。(3) 服务器还要监控这些连接的状态,在客户主动离开或发生故障时从列表中删除相应的表项,并及时更新连接表。这些要求可以通过CSocket类提供的功能实现。从CSocket派生出两个类CListenSocket和CClientSocket,它们分别用来侦听客户的连接请求和建立与客户的连接。服务器只需要一个侦听套接字C
13、ListenSocket,然后根据客户的连接请求动态创建客户套接字CClientSocket。客户套接字的数量是不可预知的,因此需要一个列表来记录。MFC的CPtrList类就能实现这种功能。客户端聊天程序需要完成以下几个功能:(1) 客户端聊天程序要负责建立和维护与服务器的连接,通过获取用户的设置尝试与服务器的连接,并且随时检测连接的状态。(2) 客户端聊天程序要把用户输入的信息及时发送到聊天服务器。一般情况下,当用户输入一行信息并且按下回车键后聊天程序就要把这一行信息发送出去,才能及时地满足用户的交互需求。(3) 要随时准备好接受来自服务器的信息,随时把接受到的信息显示出来,让用户及时看到
14、对方的响应。(4) 在用户退出聊天过程是要关闭与服务器的连接。比较好的做法是提前通知服务器或者直接给服务器发送一条退出通知,使得服务器能够及时掌握客户端的连接状态,把对方客户的退出信息及时发送到对等实体上。客户端聊天程序需要使用一个通过CSocket类派生出来的CChatSocket类来实现。该套接字用来发送一个与服务器的连接请求和维持与服务器的连接,发送和接收聊天信息,完成上述各项功能。三设计流程图根据对用户的要求及功能设置可以得到以下的流程图,用户首先启动客户端,登陆服务器并向服务器发送信息,启动服务器,服务器等待客户要求并向客户反馈在线用户信息,用户向服务器发送信息,服务器处理用户的数据
15、,然后用户开始聊天。客户端的聊天分为对所有人的信息和私聊的信息,该信息应通过程序控制分别进行处理。启动登陆等待客户端登陆客户端用户创建子套接字MessageCListenSocketCClientSocketMessage登陆成功连接上发送message显示找到客户端并显示登陆失败发送ID和IP三 系统模块划分图1.系统模块划分图服务器端:服务器等待用户从主窗口发来的启动和接收消息的过程如下:首先,建立自己的套接口。在互联网的进程通信中,全局标识一个进程需要一个被称为“半相关”的三元组(协议,本地主机地址和本地端口号)来描述;而一个完整的进程通信实例,则需要一个被称为“相关”的五元组(协议,本
16、地主机地址,本地端口号,远端主机地址和远端端口号)来描述。s_sockfd=socket(AF_INET,SOCK_STREAM,0),该函数建立指定格式,数据类型和协议下的套接口。地址格式为AF_INET(唯一支持的格式);数据类型SOCK_STREAM表示建立流式套接口;第三个参数为0,即协议缺省。Bind(s_sockfd,(struct sockaddr*)&server,sizeof(server),该函数建立服务器本地的半相关。其中,server是sockaddr_in结构,其成员描述了本地端口号和本地主机地址,经过bind()将服务器进程在网上标识出来。然后建立连接,先是
17、调用listen()函数表示开始侦听,再通过accept()调用等待接收连接。Listen(s_sockfd,2)表示连接请求队列长度为2,即允许有两个请求。若有多于两个请求,则出现错误,给出错误代码。ns=accept(s_sockfd,(struct sockaddr*)& chent,& namelen), accept() 阻塞缺省等待请求队列中的请求,一旦有连接请求来到,该函数就建立一个和s有相同属性的新的套接口。Client也是一个sockaddr_in结构,连接建立时填入请求连接的套接口的半相关信息。然后,就可以接收和发送数据了。recv(ns,buf,1024,
18、0), send(ns,buf,pktlen,0)上面两个函数分别负责接收和发送数据。recv从建立连接的套接口ns接收数据放入buf中;send则将buf中数据发送给ns。至于第四个参数,表示该函数调用方式,可选择NSG_DONTROUTE和MSG_OOB,0表示缺省。最后,关闭套接口。客户端:客户端等待用户从主窗口发来的发送命令。一旦接收到发送数据请求,首先调用WSAStartup()函数,初始化Windows Socket DLL,并检查版本号:Status=WSAStartup(VersionReqd,lpmyWSAData);其中,VersionReqd描述了WinSock的版本;l
19、pmyWSAData指向一个WSADATA结构,该结构描述了Windows Sockets的实现细节。WSAStartup()之后,进程通过主机名获取主机地址:Hostaddr=gethostbyname(server_address);Hostaddr指向hostent结构,然后,进程就不断地消息循环,等待用户通过菜单选择启动。这时,通过调用Clinent(t)来启动套接口。在Clinent(t)中,首先也是调用socket()来建立套接口,为建立连接,必须立刻调用connect(),进程发出连接请求后就不管了。当连接建立好后,WINSOCKDLL自动发出一条消息给窗口函数,使程序运行下去。
20、Connect(s_sockfd,(struct sockaddrFAR*)&dst_addr,sizedlf(dst_addr);窗口函数在收到UM_SOCK消息后,判断是由哪个网络事件引起的。第一次,必然是由连接事件引起的,这样,就会执行相应的程序,同样调用WSAASyncselect()来提名DWRITE事件,希望在套接口可发送数据时接收消息。在收到FD_WRITE消息时,先调用send()发送数据,在调用WSAASyncselect()来提名FD_READ事件,希望在套接口可接收数据时收到消息,在收到FD_READ消息时,先调用recv()来接收数据,再提名FD_WRITE事件
21、,如此循环下去,直到发生外部事件FD_CLOSE。这时就调用WSAAsyncselect(s,hwnd,0,0)来停止异步选择。在窗口函数接收到WM_DESTROY消息时,先调用closesocket()来关闭套接口,再调用WSACleanup()终止Windows sockets Dll,并释放资源四 详细设计及实现1. 客户端1.1用户登录模块设计BEGIN_MESSAGE_MAP(CMainBordApp, CWinApp)ON_COMMAND(ID_HELP, CWinApp:OnHelp)END_MESSAGE_MAP()CMainBordApp:CMainBordApp()CMainBordApp theApp;BOOL CMainBordApp:InitInstance()if (!AfxSocketInit()AfxMessageBox(IDP_SOCKETS_INIT_FAILED);return FALSE;AfxEnableControlContainer();#ifdef _AFXDLLEnable3dControls();#elseEnable3dContr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论