1 Star 1 Fork 0

ayou / hyl.base.net

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

好运来网络通信开发基础组件 -- 类似于netty,封装了bio 和nio 两种模式 主要用于长连接

邹工 37798955@qq.com

序言

  1. socket 是怎么回事?

    socket 是网卡 ip:port的抽象,我们通过socket控制网卡 读写.

    我们可以想象socket 是水龙头 接在网卡上 , 你可以开关水龙头控制水流 .

    一个网卡可以绑定多个水龙头 所以.... serversocket 才能分出多个socket.

  2. channel 是什么?

    channel 是管道的意思

    我们原来的程序直接操作socket

    现在我们抽象一个channel(管道) 接到 socket(水龙头) 上

3.为什么要添加channel?

因为多路复用的原因, 怎么解释呢?  

我们想象一下 现在有一万个水龙头,都开着,一会儿有水一会儿没有水. 如果让1万人守着水龙头接水 显然太浪费人力了

所以我们把每个水龙头都接上管道 ,流到 一个自动化中心, 有水(数据)时, 通知一个人去接水 ,会不会好一些呢 ?

这个自动化中心就是  select
  1. bio 和nio 区别

    如上解释 nio 比 bio 多了 channel 和 select 中间加工环节

    在bio 模式下 我们 为每个socket 创建一个工作线程(服务员),专门针对 该通道进行处理 在nio 模型下 我们只要少量线程(服务员),因为select会把有读写需求的socket 通过通道 安排给服务员(工作线程)

    而且nio 引入的标准化管理 ,每次传入的数据虽然长短不一,但是 如果数据长度超过了缓存长度, channel 会自动把数据 分割成缓存长度, 当然如果数据长度小于缓存长度, 无需分割. 这个过程 在bio模式下 我们需要自己写.

    但是nio也带来了不便, 我们必须把数据组装起来才能用.

  2. nio 和 bio 的适用场景

    nio 适合客户端超过 1000 的场景 bio 适合客户端小于 1000 的场景

    在集群之间通信时更适合用bio 在互联网场景(用户端连接服务器)中,更适合用nio

    例如 : 每次连接只进行 一问一答 模式 就适合用nio ,所以nio 接收并处理结束后 可以立即关闭,当然如果不关闭也可以; 如果一次连接 进行多次问答 就不适合用nio 而适合用bio

  3. 注意:

    1. 因为是基于socket ,所以理论上 bio nio 之间是可以相互通信的

    2. bio 和nio 都属于底层api ,一般不会直接使用, 需要封装 以下 基础加工函数 才好使用 包过滤 基础包的拆包和解包 数据包的压缩和解压

  4. 为什么要开发这个组件,是不是重复造轮子 ,我觉得不是

    1. 开发这样组件,我们可以更好的理解socket原理,netty 原理
    2. 我们可以更好的控制底层数据
    3. 我们更加清楚 网络性能和程序传输性能的边界
    4. 分布式集群需要我们对底层更加清楚.

概述

接口

	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  测试用例

空文件

简介

南通好运来 网络基础组件 为了集群连接服务 展开 收起
Java
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
Java
1
https://gitee.com/zdy-ah/hyl.base.net.git
git@gitee.com:zdy-ah/hyl.base.net.git
zdy-ah
hyl.base.net
hyl.base.net
008

搜索帮助