CN103530172A - 一种基于nio的简易高效的socket通信框架 - Google Patents
一种基于nio的简易高效的socket通信框架 Download PDFInfo
- Publication number
- CN103530172A CN103530172A CN201210228761.3A CN201210228761A CN103530172A CN 103530172 A CN103530172 A CN 103530172A CN 201210228761 A CN201210228761 A CN 201210228761A CN 103530172 A CN103530172 A CN 103530172A
- Authority
- CN
- China
- Prior art keywords
- read
- session
- socket
- event
- write
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Landscapes
- Computer And Data Communications (AREA)
Abstract
本发明公开一种基于nio的简易高效的socket通信框架,分为TCP连接建立部分和IO读写处理部分。客户端或者服务端连接建立之后,将建立起的会话session交给IO读写处理部分,将客户端和服务端的连接建立部分抽象出来,将连接建立和IO读写处理分离。使用基于事件的消息通知机制,简化了用户编程接口,使得用户在编写网络程序时无需考虑复杂的底层实现机制,专注在自己的业务逻辑上面;基于可配置的多线程IO读写机制,高效的处理IO读写事件,提高socket读写性能,同时在业务压力降低时能释放不用的线程资源;考虑各种常见问题处理的session的设计,有效的处理超时,TCP消息拆包、粘包问题。
Description
技术领域
本发明涉及网络编程技术领域,具体地说,涉及的是一种基于nio的简易高效的socket通信框架。
背景技术
网络编程是所有具有通信需求的软件开发面临的共同问题,实现高效、稳定的通信基础框架对于提高软件开发的质量、开发速度都具有非常重要的意义。Java编程语言提供了nio的网络编程基础接口,但是用户使用起来仍然非常不方便,甚至带来效率方面的瓶颈。
Java网络编程存在着如下普遍性的问题:
1.传统的IO包是基于阻塞模型的,在处理高并发访问请求时,需要并发多个线程,线程调度的消耗对程序效率影响极大。
2.nio改正了传统模型的缺陷,有读写事件时,会有主动通知机制。但是nio提供的编程接口复杂,用户不容易掌握,代码写起来复杂,且常常会由于忘记处理各种各样的异常产生错误,不能充分发挥nio的优势。
经检索发现,申请号为200710079396.3的中国专利,该发明公开了“一种处理异步消息队列的方法,包括步骤:A.异步socket将接收到的底层数据放入接收缓存,判断异步消息队列中是否有未读取的异步读消息,如果异步消息队列中没有未读取的异步读消息则向所述异步消息队列中写入一异步读消息,执行步骤B,如果异步消息队列中有未读取的异步读消息,则执行步骤B;B.上层协议读取所述异步读消息后,从异步socket接收缓存中读取底层数据。本发明还公开了一种处理异步消息队列的系统和一种异步socket。”
该发明与本发明的技术要点比较:
1.该发明为了解决底层socket异步消息队列满载的情况,侧重于协议层次的优化;本发明侧重在上层的架构层次的优化,提供一个易用、高效的socket框架。
2.该发明着重解决异常状态下异步消息对异步队列的过量占用情况,通过提高上层协议的处理速度来解决这个问题,但是上层协议的实现用户无法掌控,在上层协议处理消息慢的情况下,异步socket就变成了同步socket;本发明通过在session中设计消息队列,在上层协议中做缓存,提高消息处理速度,可以更好的解决这个问题。
申请号为200810170990.8的中国专利,该发明公开了“一种socket数据传输处理方法及装置,该方法为将socket数据写入内存队列中;如果内存队列已满,则按socket数据的优先级写入相应优先级的缓存文件中;再轮询读取缓存文件,实时地将缓存文件中的socket数据写入到内存队列中;然后内存队列将socket数据传输给读取socket数据的接口。”
该发明与本发明的技术要点比较:
1.该发明解决了接收消息的内存队列满的情况下,通过写入缓存文件的方式解决这个问题;本发明侧重于设计整个socket网络通讯的架构。
2.该发明可以和本发明的方案一起使用,提高网络程序的稳定性和可靠性。在本发明中session中设计了接收队列来缓存消息,在消息数量过多的情况下可以综合该方案对队列进行优化,通过写入缓存来防止数据丢失。
发明内容
本发明的目的在于解决现有技术中的上述不足,提供一种基于nio的简易高效的socket通信框架,在nio包的基础上构建了一个简易高效的socket框架,既降低用户网络编程的复杂度,同时也能保证程序的性能。
为实现上述的目的,本发明所述的基于nio的简易高效的socket通信框架,主要分为两个部分,TCP连接建立部分和IO读写处理部分。客户端或者服务端连接建立之后,将建立起的会话(session)交给IO读写处理部分。本发明将客户端和服务端的连接建立部分抽象出来,根据socket连接建立之后进行的都是IO操作的共同点,将连接建立和IO读写处理分离,最大可能的实现了代码的复用。
连接建立部分包含客户端连接建立和服务端连接建立。服务端部分启动时开启监听端口,等待客户端的连接。连接建立后,将建立的socket以及建立时间等信息封装为session,交给IO读写处理部分进行读写处理。
IO读写处理部分主要用来处理IO事件,由于高并发socket时瓶颈在于IO读写,为了充分利用IO资源,本模块采用多线程。线程数目可以配置,并且在没有待处理的session时,线程会自动结束,释放系统资源。
本发明提供session用来保存从TCP连接建立到连接关闭之间所用到的和此连接相关的所有状态信息。主要包含以下部分:
1.和此session关联的客户端和服务端连接信息,客户端地址、服务端地址等。
2.连接时间信息,比如连接建立时间,上次读、写事件的时间。记录时间信息主要用来判断当前session是否处于活动状态,如果不活动的话生成Idle事件。Idle事件有三类:读idle、写idle、读写同时idle。
3.发送消息队列,记录待发送的所有消息,在IO繁忙时可以作为数据缓存。
4.接收消息队列,存储接收的所有消息,由于TCP是基于流的协议设计,在发送或者接受消息时存在拆包、粘包的现象,消息队列可以缓存数据,等数据接收完成时再进行处理。
5.统计信息,比如读取、发送的所有数据大小,产生的连续的idle事件数目。
本发明另外提供基于事件的用户编程接口,在socket连接建立之后,用户只需要处理对应socket连接的相应事件,具体的编程细节对用户完全透明,Socket事件以及对应的事件说明如下:
socket建立:TCP协议经过三次握手,建立连接。在此事件中适合做一些初始化工作,设置一些状态的初始值。
socket关闭:TCP协议关闭连接。此事件适合做一些资源释放回收工作。
session不活动:经过了设定的超时时间,无读写操作。idle事件分为3类,第一类为读idle,即在超时时间间隔内没有接收到任何数据;第二类为写idle,在超时时间间隔内无数据发送;第三类为读写idle,即在超时时间间隔内既没有读事件,也没有写事件。
此事件适合做服务端应用,当检测到客户端无任何动作时关闭连接,释放资源。
session收到消息:收到对方发送过来的数据流。用户可以调用后续业务逻辑,处理接收到的数据。
session消息已经发送:消息已经发送出去。通知用户要发送的数据已经发送完成。
异常事件:在执行过程中出现的各种异常。此事件通知用户在整个执行过程中捕获了未识别的异常,用户可以在此进行异常的识别和处理。
采用上述技术方案之后,本发明具有的有益效果:
(1)使用基于事件的消息通知机制,简化了用户编程接口,使得用户在编写网络程序时无需考虑复杂的底层实现机制,专注在自己的业务逻辑上面;
(2)基于可配置的多线程IO读写机制,高效的处理IO读写事件,提高Socket读写性能,同时在业务压力降低时能释放不用的线程资源;
(3)考虑各种常见问题处理的会话(session)的设计,有效的处理超时,TCP消息拆包、粘包问题。
本发明在nio包的基础上构建了一个简易高效的socket框架,既降低用户网络编程的复杂度,同时也能保证程序的性能。
附图说明
图1为本发明socket整体框架图。
具体实施方式
以下结合附图和实施例对本发明的技术方案作进一步的解释,但是以下的内容不用于限定本发明的保护范围。
如图1所示,一种基于nio的简易高效的socket通信框架,具体说明如下:
1、Socket框架
整个框架主要分为两个部分,TCP连接建立部分和IO读写处理部分。客户端或者服务端连接建立之后,将建立起的会话(session)交给IO读写处理部分。本发明将客户端和服务端的连接建立部分抽象出来,根据socket连接建立之后进行的都是进行IO操作的共同点,将连接建立和IO读写处理分离,最大可能的实现了代码的复用。
连接建立部分包含客户端连接建立和服务端连接建立。服务端部分启动时开启监听端口,等待客户端的连接。连接建立后,将建立的socket以及建立时间等信息封装为session,交给IO读写部分进行读写处理。
IO读写处理部分主要用来处理IO事件,由于高并发socket时瓶颈在于IO读写,为了充分利用IO资源,本模块采用多线程,线程数目可以配置,并且在没有待处理的session时,线程会自动结束,释放系统资源。
2、用户接口
提供基于事件的用户编程接口,在socket连接建立之后,用户只需要处理对应socket连接的相应事件,具体的编程细节对用户完全透明,事件列表如下所示:
表格1用户编程接口说明
用户编程接口定义如下所示:
本发明上述通信框架:
1、socket架构将TCP连接建立与IO读写分离开,使得服务端和客户端在连接建立之后可以共用IO读写模块,提高代码复用度。IO读写模块线程数目可以配置,可以充分利用CPU提高IO读写的性能,同时在压力变小时主动释放处理线程资源。
2、抽象出session来记录每个连接的状态,并且在session内部加入发送队列和接收队列。加入接收队列可以处理socket消息拆包、粘包的状况,用户在接收到消息后判断消息是否存在此种情况,如果存在,则灵活处理队列中的消息,简化了用户编程实现;加入发送队列使得用户可以异步发送消息,充分有效利用IO资源。
3、session内部跟踪session的生命周期,用户可以配置超时时间。在超时时,主动触发此session过期事件,使得用户可以在session到期时终结此session。在做服务器时,有效终止不活动的链接,回收socket资源。
4、简化了用户编程接口,实现了基于事件的消息通知机制,用户只需实现Socket事件通知接口,当存在读写事件或者异常时处理相应消息即可。
本发明在某ESB中间件产品中,采用TCP协议接入系统的适配器中应用,ESB产品作为中心数据交换系统,获得了良好的效果,应对了大批量数据通信的情况。
本发明主要提供一个公用的基础的网络编程框架,提供简单的网络编程接口,降低用户编写网络通信程序的复杂度,使用户无需了解底层复杂的TCP协议细节和繁琐的nio编程接口;保证网络程序的正确性和高效性,为编写高性能的网络服务器提供底层支撑。
尽管本发明的内容已经通过上述优选实施例作了详细介绍,但应当认识到上述的描述不应被认为是对本发明的限制。在本领域技术人员阅读了上述内容后,对于本发明的多种修改和替代都将是显而易见的。因此,本发明的保护范围应由所附的权利要求来限定。
Claims (4)
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;
③发送消息队列,记录待发送的所有消息,在IO繁忙时可以作为数据缓存;
④接收消息队列,存储接收的所有消息,由于TCP是基于流的协议设计,在发送或者接受消息时存在拆包、粘包的现象,消息队列可以缓存数据,等数据接收完成时再进行处理;
⑤统计信息,包括读取、发送的所有数据大小,产生的连续的idle事件数目。
3.根据权利要求2所述的基于nio的简易高效的socket通信框架,特征在于:所述session内部跟踪session的生命周期,用户可以配置超时时间,在超时时,主动触发此session过期事件,使得用户可以在session到期时终结此session。
4.根据权利要求1-3任一项所述的基于nio的简易高效的socket通信框架,特征在于:所述IO读写处理部分提供基于事件的用户编程接口,在socket连接建立之后,用户只需要处理对应socket连接的相应事件,具体的编程细节对用户完全透明;socket事件以及对应的事件说明如下:
socket建立:TCP协议经过三次握手,建立连接;
socket关闭:TCP协议关闭连接;
session不活动:经过了设定的超时时间,无读写操作;
session收到消息:收到对方发送过来的数据流;
session消息已经发送:消息已经发送出去;
异常事件:在执行过程中出现的各种异常。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210228761.3A CN103530172B (zh) | 2012-07-03 | 一种基于nio的简易高效的socket通信框架 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210228761.3A CN103530172B (zh) | 2012-07-03 | 一种基于nio的简易高效的socket通信框架 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103530172A true CN103530172A (zh) | 2014-01-22 |
CN103530172B CN103530172B (zh) | 2016-11-30 |
Family
ID=
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104301333A (zh) * | 2014-11-05 | 2015-01-21 | 中国科学技术大学 | 非阻塞式握手实现方法及系统 |
CN106851513A (zh) * | 2016-12-30 | 2017-06-13 | 歌尔科技有限公司 | 一种电子产品的测试方法和系统 |
CN108427553A (zh) * | 2018-03-30 | 2018-08-21 | 吉旗(成都)科技有限公司 | 一种基于IO多路复用的纯PHP web框架 |
CN110083463A (zh) * | 2019-04-22 | 2019-08-02 | 中国地质大学(北京) | 一种3d图像引擎与数值处理软件间实时数据通信方法 |
CN111522663A (zh) * | 2020-04-23 | 2020-08-11 | 苏州浪潮智能科技有限公司 | 一种基于分布式存储系统的数据传输方法、装置和系统 |
CN112015559A (zh) * | 2020-09-03 | 2020-12-01 | 深圳虹川科技有限公司 | 基于http协议的异步实时数据更新系统及方法 |
CN112073963A (zh) * | 2020-09-16 | 2020-12-11 | 武汉虹旭信息技术有限责任公司 | 通信交互数据传输方法及装置 |
CN113472810A (zh) * | 2021-07-22 | 2021-10-01 | 广东昆仑信息科技有限公司 | 一种基于tcp/ip协议socket通信的方法及系统 |
US11218570B2 (en) | 2016-07-30 | 2022-01-04 | Huawei Technologies Co., Ltd. | Network packet processing method and apparatus and network server |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101478472A (zh) * | 2008-10-21 | 2009-07-08 | 北京闪联讯通数码科技有限公司 | 一种Socket数据传输处理方法及装置 |
CN101982955A (zh) * | 2010-11-19 | 2011-03-02 | 深圳华大基因科技有限公司 | 高性能文件传输系统及方法 |
US20120167119A1 (en) * | 2010-12-23 | 2012-06-28 | Mellanox Technologies Ltd. | Low-latency communications |
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101478472A (zh) * | 2008-10-21 | 2009-07-08 | 北京闪联讯通数码科技有限公司 | 一种Socket数据传输处理方法及装置 |
CN101982955A (zh) * | 2010-11-19 | 2011-03-02 | 深圳华大基因科技有限公司 | 高性能文件传输系统及方法 |
US20120167119A1 (en) * | 2010-12-23 | 2012-06-28 | Mellanox Technologies Ltd. | Low-latency communications |
Non-Patent Citations (1)
Title |
---|
曾自强: "基于NIO的java高性能网络应用的技术研究", 《中国优秀硕士学位论文全文数据库信息科技辑》, 15 April 2010 (2010-04-15) * |
Cited By (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104301333A (zh) * | 2014-11-05 | 2015-01-21 | 中国科学技术大学 | 非阻塞式握手实现方法及系统 |
US11218570B2 (en) | 2016-07-30 | 2022-01-04 | Huawei Technologies Co., Ltd. | Network packet processing method and apparatus and network server |
US11689646B2 (en) | 2016-07-30 | 2023-06-27 | Huawei Technologies Co., Ltd. | Network packet processing method and apparatus and network server |
CN106851513A (zh) * | 2016-12-30 | 2017-06-13 | 歌尔科技有限公司 | 一种电子产品的测试方法和系统 |
CN108427553A (zh) * | 2018-03-30 | 2018-08-21 | 吉旗(成都)科技有限公司 | 一种基于IO多路复用的纯PHP web框架 |
CN110083463A (zh) * | 2019-04-22 | 2019-08-02 | 中国地质大学(北京) | 一种3d图像引擎与数值处理软件间实时数据通信方法 |
CN110083463B (zh) * | 2019-04-22 | 2021-07-20 | 中国地质大学(北京) | 一种3d图像引擎与数值处理软件间实时数据通信方法 |
CN111522663A (zh) * | 2020-04-23 | 2020-08-11 | 苏州浪潮智能科技有限公司 | 一种基于分布式存储系统的数据传输方法、装置和系统 |
CN111522663B (zh) * | 2020-04-23 | 2022-08-19 | 苏州浪潮智能科技有限公司 | 一种基于分布式存储系统的数据传输方法、装置和系统 |
CN112015559A (zh) * | 2020-09-03 | 2020-12-01 | 深圳虹川科技有限公司 | 基于http协议的异步实时数据更新系统及方法 |
CN112073963A (zh) * | 2020-09-16 | 2020-12-11 | 武汉虹旭信息技术有限责任公司 | 通信交互数据传输方法及装置 |
CN113472810A (zh) * | 2021-07-22 | 2021-10-01 | 广东昆仑信息科技有限公司 | 一种基于tcp/ip协议socket通信的方法及系统 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104239132B (zh) | 一种唤醒对齐的方法、装置及终端 | |
CN103049317B (zh) | 云环境下基于队列的高并发数据快速写入系统及方法 | |
CN111930529B (zh) | 基于消息队列及微服务的数据同步方法、装置及系统 | |
CN104243481B (zh) | 一种用电信息采集前置数据处理的方法及系统 | |
CN104506379B (zh) | 网络数据捕获方法和系统 | |
CN106325758B (zh) | 一种队列存储空间管理方法及装置 | |
CN102739452A (zh) | 资源监控方法和系统 | |
CN101335723B (zh) | 一种即时通讯系统及其窗口的创建方法和系统 | |
CN103036961A (zh) | 一种日志分布式收集及存储方法 | |
CN103139018B (zh) | 一种调变一体化系统下的网卡状态监测与tcp通信方法 | |
CN207067982U (zh) | 一种基于fpga的异构板卡 | |
CN113938516A (zh) | 同步实现异构系统交易处理的方法及系统 | |
CN102323894A (zh) | 企业分布式应用间实现非阻塞方式相互调用的系统及方法 | |
CN102929769A (zh) | 一种基于代理服务的虚拟机内部数据采集方法 | |
WO2023046141A1 (zh) | 一种数据库网络负载性能的加速框架、加速方法及设备 | |
CN102457578A (zh) | 一种基于事件机制的分布式网络监控方法 | |
Sun et al. | Republic: Data multicast meets hybrid rack-level interconnections in data center | |
Ma et al. | X-RDMA: Effective RDMA middleware in large-scale production environments | |
CN106131162B (zh) | 一种基于iocp机制实现网络服务代理的方法 | |
CN104850516A (zh) | 一种ddr变频设计方法和装置 | |
Sun et al. | SKV: A SmartNIC-Offloaded Distributed Key-Value Store | |
CN109600278A (zh) | 一种数据通信方法、装置、设备及介质 | |
CN110798366B (zh) | 任务逻辑的处理方法、装置及设备 | |
WO2017166093A1 (zh) | 前置系统 | |
CN103530172A (zh) | 一种基于nio的简易高效的socket通信框架 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |