APP下载

基于NoB2的网络聊天室设计与简单实现

2012-07-12四川大学软件学院姚钦文

电子世界 2012年13期
关键词:聊天室跨平台线程

四川大学软件学院 姚钦文

基于NoB2的网络聊天室设计与简单实现

四川大学软件学院 姚钦文

针对现在一些网络交互系统中因为网络通讯模块效率不高从而成为系统瓶颈的问题,利用boost库设计并实现了一个异步的网络构件,该构件包含TCP和UDP两种传输协议,其中TCP包含断线重连机制,因为boost.asio库的高效异步传输机制,使得NoB2成为一个轻量、高效、跨平台的网络构件,文章讨论了缓冲区数量和传输速度的关系,并且在最后简单实现了一个基于NoB2的网络聊天室。

网络;网络构件;Boost;轻量级

1.背景

NoB2(Network On Boost for second edition)是一个网络库,能够给上层提供接口,让上层能够轻易基于本库开发出一个含有网络交互模块的系统,设计出该构件的目的是让业务逻辑层与应用层分析,实现代码的低耦合,使得系统具有扩展和修改性,并且具有很好的传输效率。

现在在市面上已经呈现出很多网络构件。如:

①1WebService[1][2],一种构建应用程序的普遍模型,可以在任何支持网络通信的操作系统中实施运行,它是一种新的web应用程序分支,是自包含、自描述、模块化的应用,可以发布、定位、通过web调用。

②EJB[3][4]是sun的服务器端组件模型,设计目标与核心应用是部署分布式应用程序。凭借java跨平台的优势,用EJB技术部署的分布式系统可以不限于特定的平台。

上面两种都是着眼于企业级的大型应用,用上面的构建来实现一些我们日常的小型网络交互系统是在不合适。目前在Boost.asio库上已经衍生出了Bas[5],OrzNet[6][7],muduo[8]等网络应用框架。

③Bas,bas为boost_asio_server(baserver)的简称,采用Half-Sync/Half-Async模式的服务器框架,使用c++实现,能够大大简化tcpserver的开发工作。Bas更多的是侧重于框架型的tcpserver方向。

④OrzNet,OrzNet是Open Esources Zone for network意思为网络开放的资源空间,是一组高效、可扩展的跨平台网络程序开发工具集。

⑤muduo,是国人陈硕开发的一个库,总的代码不超过5000行,简洁高效,不好的就是不考虑可移植性,不跨平台,只支持Linux,不支持Windows,不支持UDP,只支持TCP,不支持IPv6,只支持IPv4。

2.关于BOOST

Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一。Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容。在C++社区中影响甚大,是不折不扣的“准”标准库。Boost由于其对跨平台的强调,对标准C++的强调,与编写平台无关。

3.NoB2构件

3.1 NoB2设计目的

①建立一个独立的网络构件,以库的形式开发出来。要足够小,足够轻量、要包含多种传输协议、包含完成的客户端和服务器端。

②构件不能是一个框架形式,因为要让这个构件来适应使用者的业务逻辑,采用C++编程。

③做到最大限度的封装,让应用层上层通过简单的API调用就能建立连接并且随意传输数据,至于实现细节,用户不必知道。

④该库要有缓冲区管理和错误处理类。

⑤对于TCP连接来说,要有断线重连机制。

3.2 NoB2设计方案

3.2.1 类设计

类介绍:

● Message:需要传输的数据的持有者

● Buffer:管理多个Message

● TCPConnection:一个客户端连接对应一个TCPConnection,数据传输主要通过该类完成

● ConnectionMap:管理Connection

● ServerErrorHandler:服务器错误处理类

● ClientErrorHandler:客户端错误处理类

①Tcpserver,如图1所示

● TCPServer有维护两个Buffer,一个读Buffer和一个写Buffer,接收发送的message放在缓冲中

②Tcpclient

● TCPClient和TCPServer类似,只是不维护connectionMap,只有一个连接。

③Udpserver,如图2所示

● UDPServer:由于UDP是无连接的协议,所以天生不需要维护客户端的链接,因而没有connectionMap,只需要记录每个客户端的地址就够了,虽然UDP方式下面的Buffer类和TCP的Buffer类名相同,但是它们的实现完全不同,在不同的命名空间中。

④Udpclient端设计,如图3所示

● UDPClient:同TCPClient

3.2.2 线程设计

NoB2采用了half-sync/half-async构架模式,其实就是将异步请求排队到一个同步队列中,然后再从队列中取出请求处理,其实就是一个扩大的生产者/消费者问题。在socket编程的关键在于,将业务逻辑操作和底层的io操作分散到不同的线程中,避免业务逻辑操作可能导致整个线程的堵塞。在所有客户端和服务器端中都采用了这种构架模式,主要是出于可读性和效率方面的考虑,最大化的体现了半同步半异步架构模式中“主从关系”的优势。

TCP方式中的断线重连主要采用“心跳”机制,在客户端和服务器都维护一个超时计数,客户端定期向服务器发送“心跳”脉冲,服务器接收脉冲,清零计数,同时回复脉冲,客户端接收脉冲后也清零计数。客户端为“心跳”机制新增三个线程,一个发送脉冲线程,一个增加计数线程,一个重连线程。

客户端断线检测响应在10S内,服务器断线检测响应在30S内,当然,这个时间可以调整。

TCPServer端除了上面检测线程,还有一个监听线程,一个写线程,多个读线程,每个读线程对应一个tcp连接。

当启动一个TCPServer时,就同时启动了监听、写、检测线程,监听线程用于监听TCP连接,当TCP连接请求到达时,就新建一个读线程,读取该连接接收的消息,创建读线程完成后,返回继续监听。TCPClient端除了上面“心跳机制”线程,还有一个写线程,一个读线程。UDPServer端,由于不需要维护连接,因而只需要一个读线程,一个写线程。

UDPClient和UDPServer一样。

4.总结

①NoB2的轻量性:NoB2作为一个库,而不是一个框架,总的代码不超过3500行,功能符合基本需求,作为构件组合到其他软件中,是一个很简单的事情,同时跨系统,移植性非常强。

②NoB2的高效特性:由Boost.asio库演化而来,建立在高效的asio库上,使得NoB2的效率大大提高。asio库最大亮点在于异步IO,异步IO的概念和同步IO相对,当一个异步过程发出后,调用者通过回调函数可以得知任务的完成。就算使用者完全不懂socket编程,也可以通过使用NoB2编写出优秀简洁的网络应用。

③缓冲大小对传输速率的影响:在本机TCP客户端通过巡回地址向服务器传输一个136KB大小的ASCII码文本文件,每次传输8个字节,实验结果如表1。

可以看出,缓冲区增加有助于提高程序速率。还可以看出,当缓冲区数量增加到一定程度的时候,不会再提高速率,所以缓冲区数量要和程序消息流通量在一定的比例的时候,效率最高,也不会浪费资源。

5.聊天室的设计与实现

通过上面对NoB2构件的介绍,可以知道基于NoB2写一个网络多人聊天室是一个非常简单的事情。

首先,聊天室使用TCP传输协议,需要服务器和多个客户端来构建,客户端首先发消息给服务器,服务器收到后再给其他客户端发送相同消息,来达到多人聊天的效果。

如图4,客户端连接服务器后,新建读和写线程就完成了客户端的设置。

表1

如图5,服务器每次读一条消息,然后发给其他所有连接。

上面介绍了服务器和客户端主要代码,测试图图6中开了3个客户端,可以看出,通过NoB2高度的封装,使得应用层使用该构件开发网络应用软件变得非常的简单。

NoB2的高效封装性,使得开发者在设计开发包含网络应用的程序中,可以不用再关心网络模块部分,把而把大量的时间投入到界面设计中,一个软件的界面做的精美,能够让用户体验变得更好。

[1]R.Orfali,D.Harkey,J.Edwards.The Essential Client/Server Survival Guide[M].Robert译.天下远见出版股份有限公司,1997.

[2]ACE[EB/OL].http://baike.baidu.com/view/139851.htm.

[3]R.Orfali,D.Harkey,J.Edwards:Instant Corba[M].John Wiley & Sons,Inc.,1997.

[4]EJB[EB/OL].http://baike.baidu.com/view/3542.htm.

[5]Sun Microsystems,Inc:RMI-Remote Method Invocation,Available at:http://www.javasoft.com/products/jdk/l.l/docs/guide/rmi,March 1998.

[6]C.Szyperski:Component Software[M].Addison Wesley Longman,Ltd.,1997.

[7]OrzNET[EB/OL].http://baike.baidu.com/view/6168709.htm.

[8]发布一个基于Reactor模式的C++网络库[EB/OL].http://blog.csdn.net/solstice/article/details/5848547.

[9]An Introduction to Boost.chm[M/OL].http://ishare.iask.sina.com.cn/f/17358057.html.

[10]boost_1_41_0_doc_20091225.chm[M/OL].http://code.google.com/p/sleepwomcpp/source/browse/ebook?r=910.

[11]The Boost C++Libraries.chm[M/OL].http://ishare.iask.sina.com.cn/f/12335487.html.

姚钦文(1991—),男,四川人,大学本科,现就读于四川大学,主要研究方向:计算机网络、信息安全。

猜你喜欢

聊天室跨平台线程
基于C#线程实验探究
基于国产化环境的线程池模型研究与实现
跨平台APEX接口组件的设计与实现
歌剧聊天室 洗洗晒晒,又是新一天
歌剧聊天室 永远盛放的雪绒花
浅谈linux多线程协作
百万级SUV聊天室(5人)
基于QT的跨平台输电铁塔监控终端软件设计与实现
基于OPC跨平台通信的电机监测与诊断系统
基于B/S的跨平台用户界面可配置算法研究