
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)网络中...
python( .py )文件加.exe文件,附字体。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
encodings.xml
关键字:B/S模式、Python、在线考试 主要功能包括对首页、个人中心、用户管理、课程信息管理、试卷管理、试题管理、考试管理等
物联网实战项目
物联网技术_国内外云平台列表_1741163183.zip
永磁同步电机参数辨识:基于扩展卡尔曼滤波算法(EKF)的快速准确辨识方法及其应用研究,永磁同步电机参数辨识:基于扩展卡尔曼滤波算法(EKF)的快速准确辨识方法及其应用研究,卡尔曼滤波EKF算法,针对于永磁同步电机的电阻、电感等参数的辨识,辨识速度快,效果好,适合入门童鞋参考学习:本 包含以下内容: (1)采用SVPWM矢量控制; (2)采用转速、电流双闭环控制; (3)转速环采用PI控制; (4)电流环采用PI控制; (5)基于EKF扩展卡尔曼滤波算法,实现电感和磁链参数精确辨识; (6)各个模块功能分类明确,容易理解。 (7)卡尔曼滤波参数辨识原理及仿真过程(word)。 (8)附带一些参考文献,caj格式和pdf均有; ,卡尔曼滤波; EKF算法; 永磁同步电机; 参数辨识; SVPWM矢量控制; 双闭环控制; PI控制; 扩展卡尔曼滤波算法; 辨识速度; 辨识效果; 模块功能分类; 原理仿真过程; 参考文献,基于卡尔曼滤波EKF算法的永磁同步电机参数辨识学习指南
LS-Dyna环境下岩石巴西劈裂模拟的k文件:近场动力学3D模型探究间接拉伸破坏模拟与文献对比分析,近场动力学环境下岩石巴西劈裂模拟k文件,LS-Dyna环境下基于近场动力学进行岩石巴西劈裂模拟的k文件,尽可能复现这篇文献内容,不完全一样:A 3D Peridynamic Model to Simulate Indirect Tensile Failure in Marble. ,关键词:LS-Dyna;近场动力学;岩石巴西劈裂模拟;3D Peridynamic模型;间接拉伸破坏模拟;大理石。,复现文献:基于近场动力学的岩石巴西劈裂模拟K文件编写
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
物联网实战项目
物联网实战项目
物联网实战项目
图像识别(车牌识别)+python数据处理
使用支持RTSP的播放器(如VLCMediaPlaver)输入RTSP地址进行测试,确认视频流是否能够正常获取和播放。
PUBG锁音-过滤过大枪声,使得脚步更加清晰
物联网实战项目