好运来网络通信开发基础组件 -- 类似于netty,封装了bio 和nio 两种模式 主要用于长连接
socket 是怎么回事?
socket 是网卡 ip:port的抽象,我们通过socket控制网卡 读写.
我们可以想象socket 是水龙头 接在网卡上 , 你可以开关水龙头控制水流 .
一个网卡可以绑定多个水龙头 所以.... serversocket 才能分出多个socket.
channel 是什么?
channel 是管道的意思
我们原来的程序直接操作socket
现在我们抽象一个channel(管道) 接到 socket(水龙头) 上
3.为什么要添加channel?
因为多路复用的原因, 怎么解释呢?
我们想象一下 现在有一万个水龙头,都开着,一会儿有水一会儿没有水. 如果让1万人守着水龙头接水 显然太浪费人力了
所以我们把每个水龙头都接上管道 ,流到 一个自动化中心, 有水(数据)时, 通知一个人去接水 ,会不会好一些呢 ?
这个自动化中心就是 select
bio 和nio 区别
如上解释 nio 比 bio 多了 channel 和 select 中间加工环节
在bio 模式下 我们 为每个socket 创建一个工作线程(服务员),专门针对 该通道进行处理 在nio 模型下 我们只要少量线程(服务员),因为select会把有读写需求的socket 通过通道 安排给服务员(工作线程)
而且nio 引入的标准化管理 ,每次传入的数据虽然长短不一,但是 如果数据长度超过了缓存长度, channel 会自动把数据 分割成缓存长度, 当然如果数据长度小于缓存长度, 无需分割. 这个过程 在bio模式下 我们需要自己写.
但是nio也带来了不便, 我们必须把数据组装起来才能用.
nio 和 bio 的适用场景
nio 适合客户端超过 1000 的场景 bio 适合客户端小于 1000 的场景
在集群之间通信时更适合用bio 在互联网场景(用户端连接服务器)中,更适合用nio
例如 : 每次连接只进行 一问一答 模式 就适合用nio ,所以nio 接收并处理结束后 可以立即关闭,当然如果不关闭也可以; 如果一次连接 进行多次问答 就不适合用nio 而适合用bio
注意:
因为是基于socket ,所以理论上 bio nio 之间是可以相互通信的
bio 和nio 都属于底层api ,一般不会直接使用, 需要封装 以下 基础加工函数 才好使用 包过滤 基础包的拆包和解包 数据包的压缩和解压
为什么要开发这个组件,是不是重复造轮子 ,我觉得不是
IData1 表示了基础数据包 ,bio 和 nio传的数据的都是无序的,会粘包,分包,拆包,通过底层我们把数据装成基础包 在socket间传输
IReader 负责接收数据
ASocket 封装了bio nio 通用方法.
基于bio api 实现 上述接口
IData1
|_ BIOData1 bio 基础数据包
|_ NIOData1 Nio 基础数据包
IReader
|_ BIOReader bio 接收处理器
|_ NIOReader Nio 接收处理器
ASocket
|_ BIOSocket
|_ BIOSocketCli 客户端引用
|_ BIOSocketSrv 服务端使用
|_ NIOSocket
|_ NIOSocketCli 客户端引用
|_ NIOSocketSrv 服务端使用
在 net.pg 包中
消息数据
文件数据
指令数据
多媒体数据
文本数据
在net.handle 包 中
URI 集群服务 中间件依赖类
服务端
serversocket 监听 accept 事件 有客户接入生成 新的socket
用 reader (独立线程) 接管 socket 负责连续 读取数据
reader 每读取一个包(IData1)数据 就保存到包队列 ,等待被调用
发送时 , 把数据封装成包(IData1)格式, 交给reader 发送
客户端
客户端连接服务器 生成 新的socket
socket 可以直接发送,发送时 , 把数据封装成包(IData1)格式, 交给socket 发送
还可以 启用接收功能( 创建一个reader 用来接收服务端的反馈)
reader 每读取一个包(IData1)数据 就保存到包队列 ,等待被调用
1) 如果包队列中的数据不消费掉 ,通过配置,决定是否超过缓存队列后自动抛弃(目前未实现)
2) 后期大量的组件需要开发,我先做了一个例子 URIServicesHandle URIServicesDao,其他可以参考这个完成
3) 物联网设备发送数据到
见 hyl.test 测试用例
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。