OpenBloX的发送接收机制
OpenBlox使用Java的NIO库来实现的网络间通信。
1,Java的NIO库介绍
Java.nio:定义很多基本类型缓存(Buffer);
Java.nio.channels:定义通道及选择器等;
Java.nio.charset:字符的编码解码。
通道(Channel)首先在选择器(Selector)中注册自己感兴趣的事件,当相应的事件发生时,选择器便通过选择键(SelectionKey)通知已注册的通道。然后通道将需要处理的信息,通过缓存(Buffer)打包,编码/解码,完成输入输出控制。
通道
主要介绍ServerSocketChannel 和SocketChannel,它们都是可选择的(Selectable)通道,分别可以工作在同步和异步两种方式下,可选择是指可以有选择的注册自己感兴趣的事件。可以用channel.configureBlocking(Boolean)来设置其工作方式。ServerSocketChannel相当于ServerSocket,SocketChannel相当于Socket。
其在异步(非阻塞)的工作方式下的情况:
在服务器端,ServerSocketChannel通过静态函数open()返回一个实例serverChl。然后该通道调用serverChl.socket().bind()绑定到服务器某端口,并调用register(Selector sel,SelectionKey.OP_ACCEPT)注册OP_ACCEPT事件到一个选择器中(ServerSocketChannel只可以注册OP_ACCEPT事件)。当有客户请求连接时,选择器就会通知该通道有客户连接请求,就可以进行相应的输入输出控制了。
在客户端,clientChl实例注册自己感兴趣的事件(可以是OP_CONNECT,OP_READ,OP_WRITE的组合)后,调用clientChl.connect(InetSocketAddress)连接服务器然后进行相应处理。
选择器和选择键
选择器(Selector)的作用是:将通道感兴趣的事件放入队列中,而不是马上提交给应用程序,等已注册的通道自己来请求处理这些事件。即,选择器将会随时报告已经准备好了的通道,而且是按照先进先出的顺序。选择器是通过选择键来报告,选择键的作用就是表明哪个通道已经做好了准备,准备干什么。如果选择器中尚无通道已注册事件发生,调用Selector.select()将阻塞,直到有事件发生为止。另外,可以调用selectNow()或select(long timeout),前者立即返回,没有事件时返回0值,后者等等timeout后返回。
2,OpenBloX的发送接收机制
NIO中selector的注册:ConnectionsThreadTCP.handleAcceptable() ->registerChannel()->selectableChannel.register(selector,interestOps,channelWrapper);
发送信息
信息的发送,通过Peer.send(MessageBase message)来完成。Peer.send()方法,是通过调用以下方法来完成的PeerChannels peerChannels.send(tempBuffer);
然后通过ChannelWrapper workingChannel.write(buffer) 来完成。因此,发送信息时,信息由接口ChannelWrapper的实现类SocketChannelWrapper封装,该封装的类保持一个final类型的SocketChannel对象,即信息(ByteBuffer)最终写入SocketChannel对象中。
接收信息
信息的接收,通过ConnectionsThread.loopSelector()方法,监听是否有信息到达。如果有信息到达,则调用handleReadable继续处理,最后是通过SessionFactory.handleReceivedRequest(ByteBufferWrapper bufferWrapper,int offset,String originHost)或者handleReceivedAnswer来完成。在handleReadable中获取信息时,通过Key来得到接口ChannelWrapper的具体实现类的对象。之后的处理过程,则是通过对获取到的对象进行处理。
分享到:
相关推荐
OpenBloX-Diameter-v.2.7是一款基于Java开发的Diameter协议库,主要应用于通信网络中的认证、授权和计费(AAA)功能。Diameter是继RADIUS协议之后的一个更为强大、安全和可扩展的协议,广泛用于4G、5G等现代移动通信...
OpenBlox 1.4 :Java 1.5实现的Diameter协议栈,来自tariffsystem.com
OpenBlox允许您使用内置的物理引擎,类似于Lego的构建块和称为Lua的脚本语言来制作游戏。 使用OpenBlox制作游戏后,您只需单击鼠标即可将其打包到一个文件中,并与您想要的任何人共享您的游戏。
### 中国电信Diameter协议Cx和Dx接口规范要求解析 #### 一、概述 Diameter协议作为新一代的认证、授权与计费(AAA)协议,在电信运营商网络中扮演着核心角色,尤其在中国电信IMS(IP Multimedia Subsystem)网络中...
基于springboot大学生就业信息管理系统源码数据库文档.zip
基于java的驾校收支管理可视化平台的开题报告
时间序列 原木 间隔5秒钟 20241120
毕业设计&课设_基于 Vue 的电影在线预订与管理系统:后台 Java(SSM)代码,为毕业设计项目.zip
基于springboot课件通中小学教学课件共享平台源码数据库文档.zip
基于java的网上购物商城的开题报告
Delphi人脸检测与识别Demo1fdef-main.zip
基于java的咖啡在线销售系统的开题报告
基于java的自助医疗服务系统的开题报告.docx
内容概要:本文档全面介绍了Visual Basic(VB)编程语言的基础知识和高级应用。首先概述了VB的基本特性和开发环境,随后详细讲述了VB的数据类型、变量、运算符、控制结构、数组、过程与函数、变量作用域等内容。接着介绍了窗体设计、控件使用、菜单与工具栏的设计,文件操作、数据库访问等关键知识点。最后讨论了VB的学习方法、发展历史及其在桌面应用、Web应用、数据库应用、游戏开发和自动化脚本编写等领域的广泛应用前景。 适合人群:初学者和中级程序员,尤其是希望快速掌握Windows桌面应用开发的人群。 使用场景及目标:①掌握VB的基础语法和开发环境;②学会使用VB创建复杂的用户界面和功能完整的应用程序;③理解数据库操作、文件管理和网络编程等高级主题。 其他说明:Visual Basic是一种简单易学且功能强大的编程语言,尤其适合用于开发Windows桌面应用。文中不仅覆盖了基础知识,还包括了大量的实用案例和技术细节,帮助读者快速提升编程技能。
基于java的疫情期间高校防控系统开题报告.docx
基于springboot+vue社区老年人帮扶系统源码数据库文档.zip
基于java的超市商品管理系统的开题报告.docx
基于SpringBoot房屋买卖平台源码数据库文档.zip
xdu限通院23微处理器系统与应用大作业(两只老虎),适应于汇编语言keil软件,
<项目介绍> - 新闻类网站系统,基于SSM(Spring、Spring MVC、MyBatis)+MySQL开发,高分成品毕业设计,附带往届论文 - 不懂运行,下载完可以私聊问,可远程教学 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------