# java-nio **Repository Path**: emeory/java-nio ## Basic Information - **Project Name**: java-nio - **Description**: Java NIO 网络通信框架 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-04-24 - **Last Updated**: 2021-12-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## Java-NIO网络通信框架 ### 1.项目介绍 本项目是基于 Java NIO 的同步非阻塞网络通信框架,改善了传统 `socket` 通信中占用系统资源太大,不支持大量并发连接的问题。 框架一共有四大组件: `ParticleInterceptor`, `ByteFilter`, `ObjectFilter`, `ParticleHandler`,面向接口设计,并且有默认实现,既方便用户开发,有方便扩展。 框架的核心概念是 `ParticleSession`, 代表着一个网络连接,用户通过它进行发送信息。 为了方便开发网络程序,框架实现了对Java NIO 的封装, 最核心最底层的类就是 `BaseSelectorThread`, `BaseSelectorThread`.首先,`BaseSelectorThread` 抽象了NIO的四种通知事件: `Acceptable`, `Connectable`, `Readable`, `Writable`, 设计了回调接口。 `CoreSelectorThread` 实现了这四种事件的逻辑处理,这是框架最底层的功能, 其他的功能都是基于此进行开发。 同时采用了 `Reactor` 模型, 连接事件与IO事件是在不同的线程中处理。 ### 2.组件介绍 - `ParticleInterceptor` : 拦截器 服务端功能组件,当一个新连接建立的时候,用户可以通过它设置是否同意连接,可以实现类似于通过IP地址限制客户端连接的功能 - `ByteFilter` : 字节过滤器 用于用户实现自己的序列化以及编码解码,用户通过这个组件把一个Java对象转换为字节数组,并且基于自己的协议进行编码与解码。转换后的字节数组就会通过网络发送 - `ObjectFilter` : 对象过滤器 这个组件用于用户对需要发送或者接收的对象进行进一步加工处理 - `ParticleHandler`: 处理器 用户逻辑处理的组件,新链接建立,接收到数据等等事件发生的时候,会通过这个接口通知用户 ### 3.网络数据流转过程 #### 数据接收: 接收到数据之后,首先会经过 `ByteFilter`,在这里进行对网络数据的分包,在需要的情况下,还会进行解码,然后把数据反序列化为Java对象。 得到的Java对象会经过 `ObjectFilter` 组件,用户对这个对象做进一步处理。之后,框架就会通过`ParticleHandler`通知用户,并且会把处理好的Java对象注入给用户 #### 数据发送: 首先,用户通过`ParticleSession`发送一个对象,然后框架会调用用户的`ObjectFilter`对这个对象做进一步处理,然后会调用用户的`ByteFilter`把对象序列化为字节数组, 用户还可以在这个环节对数据进行加密或者编码,然后框架会把最终的字节数组发送出去 ### 4.使用实示例 在 `example`包下面是最简单的使用示例 - 服务端: ```java public class NioServer { public static void main(String[] args) { ParticleServer server = new ParticleServer.Builder().build(); server.openService(); try { server.bind("127.0.0.1", 8080); } catch (Exception e) { e.printStackTrace(); } } } ``` - 客户端: ```java public class NioClient { public static void main(String[] args) { ParticleClient client = new ParticleClient.Builder().build(); client.openService(); client.connect("127.0.0.1", 8080); } } ```