一种基于nio的简易高效的socket通信框架的制作方法

文档序号:6486725阅读:178来源:国知局
一种基于nio的简易高效的socket通信框架的制作方法
【专利摘要】本发明公开一种基于nio的简易高效的socket通信框架,分为TCP连接建立部分和IO读写处理部分。客户端或者服务端连接建立之后,将建立起的会话session交给IO读写处理部分,将客户端和服务端的连接建立部分抽象出来,将连接建立和IO读写处理分离。使用基于事件的消息通知机制,简化了用户编程接口,使得用户在编写网络程序时无需考虑复杂的底层实现机制,专注在自己的业务逻辑上面;基于可配置的多线程IO读写机制,高效的处理IO读写事件,提高socket读写性能,同时在业务压力降低时能释放不用的线程资源;考虑各种常见问题处理的session的设计,有效的处理超时,TCP消息拆包、粘包问题。
【专利说明】—种基于nio的简易高效的socket通信框架
【技术领域】
[0001]本发明涉及网络编程【技术领域】,具体地说,涉及的是一种基于nio的简易高效的socket通信框架。
【背景技术】
[0002]网络编程是所有具有通信需求的软件开发面临的共同问题,实现高效、稳定的通信基础框架对于提高软件开发的质量、开发速度都具有非常重要的意义。Java编程语言提供了 nio的网络编程基础接口,但是用户使用起来仍然非常不方便,甚至带来效率方面的瓶颈。
[0003]Java网络编程存在着如下普遍性的问题:
[0004]1.传统的10包是基于阻塞模型的,在处理高并发访问请求时,需要并发多个线程,线程调度的消耗对程序效率影响极大。
[0005]2.nio改正了传统模型的缺陷,有读写事件时,会有主动通知机制。但是nio提供的编程接口复杂,用户不容易掌握,代码写起来复杂,且常常会由于忘记处理各种各样的异常产生错误,不能充分发挥nio的优势。
[0006]经检索发现,申请号为200710079396.3的中国专利,该发明公开了 “一种处理异步消息队列的方法,包括步骤:A.异步socket将接收到的底层数据放入接收缓存,判断异步消息队列中是否有未读取的异步读消息,如果异步消息队列中没有未读取的异步读消息则向所述异步消息队列中写入一异步读消息,执行步骤B,如果异步消息队列中有未读取的异步读消息,则执行步骤B;B.上层协议读取所述异步读消息后,从异步socket接收缓存中读取底层数据。本发明还公开了一种处理异步消息队列的系统和一种异步socket。”
[0007]该发明与本发明的技术要点比较:
[0008]1.该发明为了解决底层socket异步消息队列满载的情况,侧重于协议层次的优化;本发明侧重在上层的架构层次的优化,提供一个易用、高效的socket框架。
[0009]2.该发明着重解决异常状态下异步消息对异步队列的过量占用情况,通过提高上层协议的处理速度来解决这个问题,但是上层协议的实现用户无法掌控,在上层协议处理消息慢的情况下,异步socket就变成了同步socket ;本发明通过在session中设计消息队列,在上层协议中做缓存,提高消息处理速度,可以更好的解决这个问题。
[0010]申请号为200810170990.8的中国专利,该发明公开了 “一种socket数据传输处理方法及装置,该方法为将socket数据写入内存队列中;如果内存队列已满,则按socket数据的优先级写入相应优先级的缓存文件中;再轮询读取缓存文件,实时地将缓存文件中的socket数据写入到内存队列中;然后内存队列将socket数据传输给读取socket数据的接口。”
[0011]该发明与本发明的技术要点比较:
[0012]1.该发明解决了接收消息的内存队列满的情况下,通过写入缓存文件的方式解决这个问题;本发明侧重于设计整个socket网络通讯的架构。[0013]2.该发明可以和本发明的方案一起使用,提高网络程序的稳定性和可靠性。在本发明中session中设计了接收队列来缓存消息,在消息数量过多的情况下可以综合该方案对队列进行优化,通过写入缓存来防止数据丢失。

【发明内容】

[0014]本发明的目的在于解决现有技术中的上述不足,提供一种基于nio的简易高效的socket通信框架,在nio包的基础上构建了一个简易高效的socket框架,既降低用户网络编程的复杂度,同时也能保证程序的性能。
[0015]为实现上述的目的,本发明所述的基于nio的简易高效的socket通信框架,主要分为两个部分,TCP连接建立部分和10读写处理部分。客户端或者服务端连接建立之后,将建立起的会话(session)交给10读写处理部分。本发明将客户端和服务端的连接建立部分抽象出来,根据socket连接建立之后进行的都是10操作的共同点,将连接建立和10读写处理分离,最大可能的实现了代码的复用。
[0016]连接建立部分包含客户端连接建立和服务端连接建立。服务端部分启动时开启监听端口,等待客户端的连接。连接建立后,将建立的socket以及建立时间等信息封装为session,交给10读写处理部分进行读写处理。
[0017]10读写处理部分主要用来处理10事件,由于高并发socket时瓶颈在于10读写,为了充分利用10资源,本模块采用多线程。线程数目可以配置,并且在没有待处理的session时,线程会自动结束,释放系统资源。
[0018]本发明提供session用来保存从TCP连接建立到连接关闭之间所用到的和此连接相关的所有状态信息。主要包含以下部分:
[0019]1.和此session关联的客户端和服务端连接信息,客户端地址、服务端地址等。
[0020]2.连接时间信息,比如连接建立时间,上次读、写事件的时间。记录时间信息主要用来判断当前session是否处于活动状态,如果不活动的话生成Idle事件。Idle事件有三类:读idle、写idle、读写同时idle。
[0021]3.发送消息队列,记录待发送的所有消息,在10繁忙时可以作为数据缓存。
[0022]4.接收消息队列,存储接收的所有消息,由于TCP是基于流的协议设计,在发送或者接受消息时存在拆包、粘包的现象,消息队列可以缓存数据,等数据接收完成时再进行处理。
[0023]5.统计信息,比如读取、发送的所有数据大小,产生的连续的idle事件数目。
[0024]本发明另外提供基于事件的用户编程接口,在socket连接建立之后,用户只需要处理对应socket连接的相应事件,具体的编程细节对用户完全透明,Socket事件以及对应的事件说明如下:
[0025]socket建立:TCP协议经过三次握手,建立连接。在此事件中适合做一些初始化工作,设置一些状态的初始值。
[0026]socket关闭:TCP协议关闭连接。此事件适合做一些资源释放回收工作。
[0027]session不活动:经过了设定的超时时间,无读写操作。idle事件分为3类,第一类为读idle,即在超时时间间隔内没有接收到任何数据;第二类为写idle,在超时时间间隔内无数据发送;第三类为读写idle,即在超时时间间隔内既没有读事件,也没有写事件。[0028]此事件适合做服务端应用,当检测到客户端无任何动作时关闭连接,释放资源。
[0029]session收到消息:收到对方发送过来的数据流。用户可以调用后续业务逻辑,处理接收到的数据。
[0030]session消息已经发送:消息已经发送出去。通知用户要发送的数据已经发送完成。
[0031]异常事件:在执行过程中出现的各种异常。此事件通知用户在整个执行过程中捕获了未识别的异常,用户可以在此进行异常的识别和处理。
[0032]采用上述技术方案之后,本发明具有的有益效果:
[0033]( I)使用基于事件的消息通知机制,简化了用户编程接口,使得用户在编写网络程序时无需考虑复杂的底层实现机制,专注在自己的业务逻辑上面;
[0034](2)基于可配置的多线程IO读写机制,高效的处理IO读写事件,提高Socket读写性能,同时在业务压力降低时能释放不用的线程资源;
[0035](3)考虑各种常见问题处理的会话(session)的设计,有效的处理超时,TCP消息拆包、粘包问题。
[0036]本发明在nio包的基础上构建了一个简易高效的socket框架,既降低用户网络编程的复杂度,同时也能保证程序的性能。
【专利附图】

【附图说明】
[0037]图1为本发明socket整体框架图。
【具体实施方式】
[0038]以下结合附图和实施例对本发明的技术方案作进一步的解释,但是以下的内容不用于限定本发明的保护范围。
[0039]如图1所示,一种基于nio的简易高效的socket通信框架,具体说明如下:
[0040]1、Socket 框架
[0041]整个框架主要分为两个部分,TCP连接建立部分和10读写处理部分。客户端或者服务端连接建立之后,将建立起的会话(session)交给10读写处理部分。本发明将客户端和服务端的连接建立部分抽象出来,根据socket连接建立之后进行的都是进行10操作的共同点,将连接建立和10读写处理分离,最大可能的实现了代码的复用。
[0042]>连接建立部分
[0043]连接建立部分包含客户端连接建立和服务端连接建立。服务端部分启动时开启监听端口,等待客户端的连接。连接建立后,将建立的socket以及建立时间等信息封装为session,交给10读写部分进行读写处理。
[0044]> 10读写处理部分
[0045]10读写处理部分主要用来处理10事件,由于高并发socket时瓶颈在于10读写,为了充分利用10资源,本模块采用多线程,线程数目可以配置,并且在没有待处理的session时,线程会自动结束,释放系统资源。
[0046]2、用户接口
[0047]提供基于事件的用户编程接口,在socket连接建立之后,用户只需要处理对应socket连接的相应事件,具体的编程细节对用户完全透明,事件列表如下所示:
[0048]表格I用户编程接口说明
【权利要求】
1.一种基于nio的简易高效的socket通信框架,其特征包括TCP连接建立部分和IO读写处理部分,将连接建立和IO读写分离;其中: 连接建立部分包含客户端连接建立和服务端连接建立,服务端部分启动时开启监听端口,等待客户端的连接;连接建立后,将建立的socket以及建立时间等信息封装为session,交给IO读写处理部分进行读写处理; IO读写处理部分主要用来处理IO事件,采用多线程,线程数目可以配置,并且在没有待处理的session时,线程会自动结束,释放系统资源。
2.根据权利要求1所述的基于nio的简易高效的socket通信框架,特征在于:所述连接建立部分,其中session用来保存从TCP连接建立到连接关闭之间所用到的和此连接相关的所有状态信息,包含以下部分: ①和此session关联的客户端和服务端连接信息,客户端地址、服务端地址; ②连接时间信息,包括连接建立时间,上次读、写事件的时间;记录时间信息主要用来判断当前session是否处于活动状态,如果不活动的话生成Idle事件;idle事件有三类:读idle、写idle、读写同时idle ; ③发送消息队列,记录待发送的所有消息,在10繁忙时可以作为数据缓存; ④接收消息队列,存储接收的所有消息,由于TCP是基于流的协议设计,在发送或者接受消息时存在拆包、粘包的现象,消息队列可以缓存数据,等数据接收完成时再进行处理; ⑤统计信息,包括读取、发送的所有数据大小,产生的连续的idle事件数目。
3.根据权利要求2所述的基于nio的简易高效的socket通信框架,特征在于:所述session内部跟踪session的生命周期,用户可以配置超时时间,在超时时,主动触发此session过期事件,使得用户可以在session到期时终结此session。
4.根据权利要求1-3任一项所述的基于nio的简易高效的socket通信框架,特征在于:所述10读写处理部分提供基于事件的用户编程接口,在socket连接建立之后,用户只需要处理对应socket连接的相应事件,具体的编程细节对用户完全透明;socket事件以及对应的事件说明如下: socket建立:TCP协议经过三次握手,建立连接; socket关闭:TCP协议关闭连接; session不活动:经过了设定的超时时间,无读写操作; session收到消息:收到对方发送过来的数据流; session消息已经发送:消息已经发送出去; 异常事件:在执行过程中出现的各种异常。
【文档编号】G06F9/46GK103530172SQ201210228761
【公开日】2014年1月22日 申请日期:2012年7月3日 优先权日:2012年7月3日
【发明者】孟文超, 赵新阳, 彭乐, 藏磊, 刘晓 申请人:上海宝信软件股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1