网络聊天室设计与实现Word下载.docx
《网络聊天室设计与实现Word下载.docx》由会员分享,可在线阅读,更多相关《网络聊天室设计与实现Word下载.docx(34页珍藏版)》请在冰豆网上搜索。
![网络聊天室设计与实现Word下载.docx](https://file1.bdocx.com/fileroot1/2022-12/12/84aee0c2-4bc2-4f12-ac95-3e62ff243cd0/84aee0c2-4bc2-4f12-ac95-3e62ff243cd01.gif)
2课题相关理论分析
2.1C/S构架的软件分析
C/S(Client/Server)结构,即大家熟知的客户机和服务器结构。
它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。
目前大多数应用软件系统都是Client/Server形式的两层结构,由于现在的软件应用系统正在向分布式的Web应用发展,Web和Client/Server应用都可以进行同样的业务处理,应用不同的模块共享逻辑组件。
因此,内部的和外部的用户都可以访问新的和现有的应用系统,通过现有应用系统中的逻辑可以扩展出新的应用系统,这也就是目前应用系统的发展方向。
传统的C/S体系结构虽然采用的是开放模式,但这只是系统开发一级的开放性,在特定的应用中无论是Client还是Server都还需要特定的软件支持。
由于没能提供用户真正期望的开放环境,C/S结构的软件需要针对不同的操作系统系统开发不同版本的软件,加之产品的更新换代十分快,已经很难适应百台电脑以上局域网用户同时使用,而且代价高,效率低。
但是C/S架构软件还是具有一定的优势,分析如下:
(1)应用服务器运行数据负荷较轻
最简单的C/S体系结构的数据库应用由两部分组成,即客户应用程序和数据库服务器程序。
二者可分别称为前台程序与后台程序。
运行数据库服务器程序的机器,也称为应用服务器。
一旦服务器程序被启动,就随时等待响应客户程序发来的请求;
客户应用程序运行在用户自己的电脑上,对应于数据库服务器,可称为客户电脑,当需要对数据库中的数据进行任何操作时,客户程序就自动地寻找服务器程序,并向其发出请求,服务器程序根据预定的规则作出应答,送回结果,应用服务器运行数据负荷较轻。
(2)数据的储存管理功能较为透明
在数据库应用中,数据的储存管理功能,是由服务器程序和客户应用程序分别独立进行的,前台应用可以违反的规则,并且通常把那些不同的(不管是已知还是未知的)运行数据,在服务器程序中不集中实现,例如访问者的权限,编号可以重复、必须有客户才能建立定单这样的规则。
所有这些,对于工作在前台程序上的最终用户,是“透明”的,他们无须过问(通常也无法干涉)背后的过程,就可以完成自己的一切工作。
在客户服务器架构的应用中,前台程序不是非常“瘦小”,麻烦的事情都交给了服务器和网络。
在C/S体系的下,数据库不能真正成为公共、专业化的仓库,它受到独立的专门管理。
2.2TCP/IP协议分析
TCP/IP(TransmissionControlProtocol/InternetProtocol,传输控制协议/网际协议)是发展至今最成功的通信协议,它允许分布在各地的安装着完全不同系统的计算机相互通信。
TCP/IP协议[2、3]可以看成是一种在网上完成信息传输的通用语言,TCP/IP协议中包含着很多个协议,它们用来构成和描述计算机与通信设备间的网络通信规
范。
TCP/IP协议是一个四层的网络协议模型,如图2.1所示。
图2.1TCP/IP协议层
TCP/IP协议中各层的功能相互独立并由下层向上层提供服务,各层功能描述如下:
(1)应用层:
该层向用户提供一组常用的应用程序。
在TCP/IP协议的应用层中包括了OSI模型中的应用层、表示层和会话层的部分功能。
(2)传输层:
该层主要为两台主机上的应用程序提供端到端的数据通信,它分为两个不同的协议,TCP(传输控制协议)和UDP(用户数据报协议)。
TCP协议是可靠的、全双工的、面向连接的和以字节流传输数据的控制协议;
UDP协议是不可靠的、全双工的、无连接的和数据通过一系列包方式传输的协议。
(3)网间网层:
该层负责分组在网络中的活动,该层协议的主要内容工作是:
1处理来自传输层的分组发送请求。
2处理来自网络接口层的输入数据报。
3处理网间控制报文协议(ICMP)报文。
4处理传输中的路径、流量和拥塞等问题。
(4)网络接口层:
TCP/IP的网络接口层负责接受IP数据报并通过网络将接收到的内容发送出去,或者从网络上接收物理帧,然后抽出其中的IP数据报传送给网间网层。
2.3WINSOCK技术分析
WINSOCK[4]来源于UNIX的Socket。
现在看到的Windows下的Internet软件都是在WINSOCK的基础下开发的,WINSOCK主要经历了两个版本日期:
WINSOCK1.1和WINSOCK2.0。
在VC环境中,网络程序经常使用CAsyncSocket和CSocket类,他们都是MFC类库中的成员,CSocket是CAsyncSocket的子类,而CAsynSocket用面向对象的方法封装了WINSOCK。
利用Socket进行通信,有两种主要的方式:
第一种是面向连接的流方式,顾名思义,在这种方式下,两个通信的应用程序之间先要建立一种连接链路,这种方式对应的是TCP(TransportControlProtocol)协议。
第二种叫做无连接的数据
报文方式,它对应的是UDP(UserDatagramProtocol)协议。
流方式的特点是通信可靠,对数据有校验和重发的机制;
数据报方式由于取消了重发校验机制,能够达到较高的通信速率,可以用做一些对数据可靠性要求不高的通信。
面向无连接的数据报方式调用过程如图2.3所示;
面向连接的流方式调用过程如图2.2所示。
图2.2面向无连接的数据报方式
图2.3面向连接的流方式
在网络通信中,由于网络拥挤或一次发送的数据量过大等原因,经常会发生交换的数据在短时间内不能传送完,收发数据的函数因此不能返回,这种现象叫做阻塞。
WINSOCK对有可能阻塞的函数提供了两种处理方式,阻塞和非阻塞方式。
在阻塞方式下,收发数据的函数在被调用后一直要到传送完毕或者出错才能返回。
在阻塞期间,除了等待网络操作的完成外不能进行任何操作。
对于非阻塞方式,函数被调用后立即返回,当网络操作传送完成后由WINSOCK给应用程序发送一个消息通知操作完成,此时可以根据发送的消息传出的参数判断操作是否正常。
2.4多线程技术分析
多线程[5-13]是在一个程序内部实现多任务的能力。
应用程序可以把它自己分隔为多个线程,从而使这些线程看起来是同时在执行各自的任务。
多线程的出现才使得人机交互成为可能:
应用程序的主线程处理用户的交互输入消息(和其他消息),并建立程序中的其他工作线程,而这些工作线程则在暗地里完成应用程序的其他与交互无关的工作。
线程是进程在执行路径中的分叉。
线程包含独立的堆栈和CPU寄存器状态(进程切换时需要的信息ContextSwitch),除此之外每个线程共享所有的进程资源,包括打开的文件、信号标识、动态分配的内存和精通变量等。
一个进程内的所有线程使用一个地址空间,而这些线程的执行由系统调度程序控制,调度程序决定哪个线程执行以及什么时候执行线程。
线程有优先级别,优先权较低的线程必须等到优先权较高的线程执行完成后再执行。
在多处理器的机器上,调度程序可将多个线程放到不同的CPU上运行,这样可使处理器任务平衡,并提高系统的运行效率(吞吐率Throughput和响应时间ResponseTime)。
多线程函数是Win32的一个重要方面,其编程技术较为新颖,在程序设计思路上不同于传统的模块结构化方法,比一般的面向对象的思路复杂,尤其是对于多处理器平台的处理更为复杂。
要设计出性能良好的多线程程序,不仅需要对操作系统的处理过程很清楚,还需要对具体应用有一个全面的认识,并对应用中各线程部分的关系非常清楚,对同步模块中的同步对象的具体含义应尽可能地清晰明了,以利于在程序中控制同步事件的发生,避免出现死锁或不能同步处理的现象。
线程的创建比较简单,可以利用CreateThread或者AfxBeginThread来实现,终止线程可以用TerminateThread或者ExitThread来实现。
线程只见信息的共享可以利用全局变量来实现或者消息函数来实现,多线程的设计关键之处在于线程之间的同步。
线程的同步可以用以下几种方法:
(1)互斥量:
Mutex对象的状态在它不被任何线程拥有时才有信号,而当它
被拥有时则无信号。
Mutex对象很适合用来协调多个线程对共享资源互
斥访问。
(2)信号量:
信号对象允许同时对多个线程共享资源进行访问,在创建对象
时指定最大可同时访问的线程数。
(3)事件:
事件对象是最简单的同步对象,它包括有信号和无信号两种状态。
在线程访问某一资源之前,需要等待某一事件的发生,这时用事件对象
最合适。
(4)临界区:
在临界区中异步执行时,它只能在同一进程的线程之间共享资
源处理。
3网络通信系统方案设计
3.1局域网TCP网络通信设计
3.1.1系统流程
系统方案的目标是实现局域网中所有在线用户能相互通信,要求实现所有节点的相互通信,客户端和服务器都处在一个局域网中,在网内都有唯一的IP地址,只使用TCP[4]通信协议。
该系统采用TCP协议进行通信,需要在通信之前建立连接,才可以向通信对象发送数据。
此系统采用服务器中转的方式实现网络通信。
作为客户端在进入系统前,需要设定服务器的IP地址和服务端口号,进行登录和注册,同时服务器也获取了加入客户端的相关信息,更新用户信息表。
在这个系统中,服务器的主要作用就是及时的更新用户信息表和转发客户端发送来的数据,实现各个客户端之间的通信。
在达到系统说明的要求下,设计的系统流程如图3.1所示。
图3.1局域网TCP系统流程图
3.1.2通信分析
在局域网内要实现服务器和客户端,不同客户端间的通信,可以把服务器和客户端分开来讨论。
(1)服务器端
服务器在系统中起核心地位,它是所有客户端的中介机构。
一个客户端如果想要加入此网络通信系统,那么它必须先到服务器端进行机器注册,以便得到一张通行证。
服务器端和客户端采用TCP协议进行通信,客户端登录时就向服务器发送一条消息,这样服务器就记录下了该客户端的地址和端口号。
为了让该客户端知道系统中在线的所有在线用户信息,服务器需要一个信息表动态记载在线用户信息,当有新的客户端加入系统时,更新信息表,并向所有客户端广播这个消息。
此方案采用TCP协议,为了减少TCP连接,客户端的信息采用服务器中转的方式进行,可以假设网络系统中有N个用户(包括服务器),要实现N个用户的相互通信,采用服务器中转方式,只需N-1个TCP连接;
否则需N2-3N+2个TCP连接。
(2)客户端
通信中,客户端和服务器的地位是不平等的,所有通信必须通过服务器端进行中转,在登录时由服务器提供在线用户的信息表,在退出时也需要服务器中转退出消息。
客户端间的通信如图3.2所示,假设客户端A和客户端B通信。
从图中可以得知,A要发送消息到达B,需两次经过交换机,如果交换机到客户端A、客户端B和服务器的物理链路距离一样,并设距离为L,则客户端A发送消息到达客户端B的物理链路距离为4L,而客户端A和客户端B的实际链路距离为2L。
因此,在服务器中转过程中,消息多走了两倍的距离。
在传送时间就链路上的传送来说也长了两倍。
图3.2局域网TCP服务器转发客户端消息
系统中的所有通信使用TCP协议,用户间的通信都由服务器中转,服务器是该系统的绝对核心,服务器的压力大,任务繁重,一旦服务器崩溃,整个系统将彻底瘫痪。
相对于UDP通信来说,速度要慢,但采用TCP协议通信质量十分有保证。
虽然服务器承受着巨大压力,但给了客户端极大的轻松。
客户端只和服务器建立TCP连接,只和服务器进行直接的网络通信。
3.2局域网UDP网络通信设计
3.2.1系统流程
系统方案的目标是实现局域网中所有在线用户能相互通信,要求只使用UDP通信协议,客户端和服务器处在同一个局域网,在网内都有唯一的IP地址。
采用UDP协议进行通信,不需建立连接,可以直接向通信对象发送数据,只需要通信对象的IP地址和服务端口号以及套接字。
作为客户端在进入系统前,需要设定服务器的IP地址和服务端口号,进行登录和注册,获取在线用户信息表,在获取了用户信息表后,就可以直接和信息表中的所有用户进行通信。
在这个系统中,服务器的主要作用就是及时的更新用户信息表和广播用户信息表,实现各个客户端之间的通信。
经过分析,设计出系统的流程图,如图3.3所示。
图3.3局域网UDP系统流程图
3.2.2通信分析
和局域网TCP协议网络通信系统一样,可以把服务器和客户端分开来讨论。
服务器在系统中起核心地位,因为它是所有客户端的中介机构。
服务器端和客户端采用UDP协议[4]进行通信,客户端登录时就向服务器发送一条消息,进行机器注册,这样服务器就记录下了该客户端的地址和端口号。
客户端在通信中,和服务器的地位是平等的,它要和在线用户通信,使用UDP协议,无需服务器端进行中转,只需在登录时由服务器提供在线用户的信息表。
在退出时无需服务器中转退出消息,只需在退出前,向所有在线用户(包括服务器)广播退出消息。
每个在线用户,只需选择用户表中的用户进行发送消息即可。
系统中的所有通信使用UDP协议,通信速度快,通信质量也有保证。
服务器端只需在客户加入,获取客户信息和广播新加入客户端信息,负担很轻,不需很多系统资源。
客户端的通信都由自己独立承担,不需服务器提供帮助。
当然这个系统也可以使用服务器中转的模式,进行网络通信,服务器中转所有的消息,客户端只需和服务器进行直接通信。
这样会给服务器增加很大的压力,客户端则变的十分轻松,这对客户端来说是件好事,但在背后对服务器的承受能力则是个极大的考验。
3.3广域网中TCP网络通信设计
3.3.1系统说明
系统方案的目标是实现广域网中所有在线用户能相互通信,要求只使用TCP通信协议。
客户端和服务器处在广域网,可能没有固定的IP地址,但服务器具有固定IP。
3.3.2网络通信分析设计
系统使用TCP协议通信,在广域网要实现服务器和客户端,不同客户端间的通信,可以把服务器和客户端分开来讨论。
服务器在系统中起核心地位。
服务器端和客户端采用TCP协议进行通信,客户端登录时就向服务器发送一条消息,进行机器注册,这样服务器就记录下了该客户端的地址和端口号。
为了让该客户端知道系统中在线的所有在线用户信息,服务器需要一个信息表动态记载在线用户信息,当有新的客户端加入系统时,更新信息表,并向所有客户端广播此消息。
这些和局域网中相似,但是和局域网中存在很大的区别,那就是并不是每个客户端都具有固定的唯一的IP地址,客户端间直接实现通信很困难,因此采用服务器中转的方式实现不同客户端间的通信。
客户端在通信中,和服务器的地位是极不平等的,所有通信必须通过服务器端进行中转,在登录时由服务器提供在线用户的信息表,并由服务器通知在线用户新客户的加入,在退出时也需要服务器中转退出消息。
但是这里和局域网中,是有区别的,因为服务器获取的是客户端在外网中的IP地址和端口。
客户端间的通信如图3.4所示,假设客户端A和客户端B要通信。
图3.4广域网TCP服务器转发客户端消息
相对于UDP通信来说,速度要慢,但采用TCP协议通信质量十分有保证,特别是系统处在广域网中,UDP协议数据丢失可能性增大。
和局域网中的区别是客户端间建立TCP连接是很困难的,因此在广域网中,采用TCP协议通信,客户端间的通信一般采用服务器中转。
3.4广域网中UDP网络通信设计
3.4.1系统说明
采用WINSOCK技术实现底层通信,利用UDP协议实现网络通信,达到服务器和客户端能相互通信,客户端之间也能相互通信。
服务器具有公网固定的IP地址,客户端可能存在不同的局域网中,整个网络通信系统分布在广域网的各个位置。
采用UDP协议进行通信,不需建立连接,可以直接向通信对象发送数据,只需要通信对象的IP地址和服务端口号以及套接字,但是客户端可能没有唯一的IP地址,在这里采用P2P穿透技术实现(原理请参考附录)。
3.4.2网络通信分析设计
和广域网TCP协议网络通信系统一样,可以把服务器和客户端分开来讨论。
服务器在系统中依然起核心地位,因为它是所有客户端的中介机构。
服务器端和客户端采用UDP协议进行通信,客户端登录时就向服务器发送一条消息,进行机器注册,这样服务器就记录下了该客户端的地址和端口号。
这些和局域网中相似,但是和局域网中存在很大的区别,那就是并不是每个客户端都具有固定的唯一的IP地址,客户端间直接实现通信很困难,但是采用P2P之UDP穿透NAT原理,依然可以实现(P2P之UDP穿透NAT原理请参考附录)。
客户端在通信中,和服务器的地位是趋于平等,和其他客户端进行通信不需服务器中转,只需服务器为他们之间建立P2P连接,在登录时由服务器提供在线用户的信息表,并由服务器通知在线用户新客户的加入,在退出时,由于客户端要向所有在线用户广播消息,需服务器建立P2P连接,这很不现实,因此也需要服务器中转退出消息。
客户端间的通信如图3.5所示。
从图中可以得知,A要发送消息到达B,需先由服务器为两个客户端建立P2P连接,这是和局域网中的最大区别,更多详细内容请参考附录。
图3.5广域网UDP客户端实现通信
系统中的所有通信使用UDP协议,用户间的通信并不是服务器中转,但是服务器仍然是该系统的绝对核心,除了前面已经提起的理由之外,在客户端间进行通信前,服务器还需为他们建立P2P连接。
相对于TCP来说,速度要快的多,因为客户端间可以实现直接通信,无需服务器的中转。
但是这也存在很大的风险,因为在服务器为客户端间建立P2P连接后,服务器将无法控制他们。
4多线程聊天室的实现
4.1系统说明
本系统基于C/S构架,采用第三章设计方案中的局域网TCP协议方案,为了优化系统,采用了多线程技术,开发工具为VisualC++6.0。
客户端和服务器都处在一个局域网中,在网内都有唯一的IP地址。
此结构由一个交换机和五台电脑组成,其中一台为服务器,各个客户端处在平等地位,服务器处在核心地位,为每个客户端进行消息中转,结构图如4.1所示。
图4.1系统结构图
其中虚线表示客户端间的通信,它是虚的通信路径,实际的通信路径是通过服务器中转的。
实线表示客户端和服务器间的通信。
每个客户端在成功登录时,都会在服务器进行机器注册,服务器记录注册客户端的IP和端口信息,并存储在客户信息表中,并广播给所有在线客户端。
每个客户端退出时,在关闭和服务器的连接时,服务器把对应的客户端信息从信息表中删除。
4.2系统服务器端的多线程处理技术
为了提高系统的服务效率,提高网络服务的响应速度,本系统在服务器采用多线程技术[5-13],服务器端多线程原理图如图4.2所示。
图4.2服务器多线程处理流程
4.3服务器端异步模式技术分析
在服务器端使用多线程技术,的确可以很好的解决网络服务响应速度慢的问题,但是服务器的主线程创建的Socket一直处