NIO
小毛贼_哪里逃
这个作者很懒,什么都没留下…
展开
-
Netty-自定义编码器和解码器
编码器 import io.netty.buffer.ByteBuf;import io.netty.channel.ChannelHandlerContext;import io.netty.handler.codec.MessageToByteEncoder;public class MyLongEncoder extends MessageToByteEncoder<Long> { @Override protected void encode(Chann..原创 2020-05-26 15:25:03 · 608 阅读 · 0 评论 -
Netty-ProtoBuf编码解码--多种类型传输
proto文件 syntax = "proto3";//声明使用proto3的语法option optimize_for=SPEED;//加快解析option java_package = "com.zeng.nio.netty.protoBuf2";//指定包名option java_outer_classname = "DataInfo";//指定生成java类名message Model{ //申明一个枚举类型 enum ModelType{ St..原创 2020-05-26 13:15:35 · 715 阅读 · 2 评论 -
Netty-ProtoBuf编码解码
IDEA安装插件 mac电脑通过brew安装ptotoc命令 brew install protobufprotoc --version pom增加依赖 <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>3.7.1&l...原创 2020-05-26 10:58:41 · 380 阅读 · 0 评论 -
Netty-WebSocket示例2
服务端 import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelInitializer;import io.netty.channel.EventLoopGroup;import io.netty.channel.nio.NioEventLoopGroup;import io.netty.channel.socket.Soc..原创 2020-05-25 14:42:50 · 196 阅读 · 0 评论 -
Netty-WebSocket示例1
依赖 <dependencies> <!--netty的依赖集合,都整合在一个依赖里面了--> <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.6.Final</version> </d..原创 2020-05-19 10:29:17 · 168 阅读 · 0 评论 -
Netty-心跳与空闲检测
网络问题 连接假死的现象是:在某一端(服务端或者客户端)看来,底层的 TCP 连接已经断开了,但是应用程序并没有捕获到,因此会认为这条连接仍然是存在的,从 TCP 层面来说,只有收到四次握手数据包或者一个 RST 数据包,连接的状态才表示已断开。 空闲检测 服务端:只需要检测一段时间内,是否收到过客户端发来的数据即可,Netty 自带的IdleStateHandler就可以实现这个功能。public class MyIdleStateHandler extends ...原创 2020-05-18 16:53:56 · 806 阅读 · 0 评论 -
Netty-性能优化
共享 handler--处理器修改为单例模式 serverBootstrap .childHandler(new ChannelInitializer<NioSocketChannel>() { protected void initChannel(NioSocketChannel ch) { ch.pipeline().addLast(new XXXHander(..原创 2020-05-18 16:25:06 · 773 阅读 · 0 评论 -
Netty-单聊和群聊
单聊 public class SessionUtil { // userId -> channel 的映射 private static final Map<String, Channel> userIdChannelMap = new ConcurrentHashMap<>(); public static void bindSession(Session session, Channel channel) { ...原创 2020-05-18 15:31:00 · 795 阅读 · 0 评论 -
Netty-ChannelHandler 的热插拔机制
public class UseOnceHandel extends ChannelInboundHandlerAdapter { public static final AttributeKey<Boolean> USED = AttributeKey.newInstance("Used"); @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Excepti.原创 2020-05-18 15:03:58 · 296 阅读 · 0 评论 -
Netty-channelHandler 的生命周期
ChannelHandler 回调方法的执行顺序 handlerAdded()当检测到新连接之后,调用ch.pipeline().addLast(new XXXHandler());之后的回调 channelRegistered() 当前的 channel 的所有的逻辑处理已经和某个 NIO 线程建立了绑定关系 channelActive() channel 的 pipeline 中已经添加完所有的 handler,并且绑定好一个 NIO 线程之后,这条连接算是真正激活了,接下来就会...原创 2020-05-18 13:56:31 · 2475 阅读 · 0 评论 -
Netty-粘包半包:拆包器(编码器和解码器)
粘包半包 粘包:多个字符串“粘”在了一起,这种 ByteBuf 为粘包半包:一个字符串被“拆”开,形成一个破碎的包,这种 ByteBuf 为半包 拆包 我们需要知道,尽管我们在应用层面使用了 Netty,但是对于操作系统来说,只认 TCP 协议,尽管我们的应用层是按照 ByteBuf 为 单位来发送数据,但是到了底层操作系统仍然是按照字节流发送数据,因此,数据到了服务端,也是按照字节流的方式读入,然后到了 Netty 应用层面,重新拼装成 ByteBuf,而这里的 ByteB..原创 2020-05-18 12:00:35 · 495 阅读 · 0 评论 -
Netty-内置的 ChannelHandler
ChannelInboundHandlerAdapter public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { ctx.fireChannelRead(msg);}接收上一个 handler 的输出,这里的msg就是上一个 handler 的输出。默认情况下 adapter 会通过fireChannelRead()方法直接把上一个 handler 的输出结果传递到下...原创 2020-05-18 10:34:35 · 1119 阅读 · 0 评论 -
Netty入门-pipeline 与 channelHandler
pipeline 与 channelHandler 的构成 无论是从服务端来看,还是客户端来看,在 Netty 整个框架里面,一条连接对应着一个 Channel,这条 Channel 所有的处理逻辑都在一个叫做ChannelPipeline的对象里面,ChannelPipeline是一个双向链表结构,他和 Channel 之间是一对一的关系。ChannelPipeline里面每个节点都是一个ChannelHandlerContext对象,这个对象能够拿到和 Channel 相...原创 2020-05-15 16:15:10 · 309 阅读 · 1 评论 -
Netty入门-通信协议编解码
设计通信协议 首先,第一个字段是魔数,通常情况下为固定的几个字节(我们这边规定为4个字节)。 为什么需要这个字段,而且还是一个固定的数?假设我们在服务器上开了一个端口,比如 80 端口,如果没有这个魔数,任何数据包传递到服务器,服务器都会根据自定义协议来进行处理,包括不符合自定义协议规范的数据包。例如,我们直接通过http://服务器ip来访问服务器(默认为 80 端口), 服务端收到的是一个标准的 HTTP 协议数据包,但是它仍然会按照事先约定好的协议来处理 HTTP 协议...转载 2020-05-15 14:43:22 · 369 阅读 · 0 评论 -
Netty入门-ByteBuf
ByteBuf结构 ByteBuf 是一个字节容器,容器里面的的数据分为三个部分,第一个部分是已经丢弃的字节,这部分数据是无效的;第二部分是可读字节,这部分数据是 ByteBuf 的主体数据, 从 ByteBuf 里面读取的数据都来自这一部分;最后一部分的数据是可写字节,所有写到 ByteBuf 的数据都会写到这一段。最后一部分虚线表示的是该 ByteBuf 最多还能扩容多少容量 以上三段内容是被两个指针给划分出来的,从左到右,依次是读指针(readerIndex)、写指针(writerIn..原创 2020-05-15 13:22:43 · 934 阅读 · 0 评论 -
Netty入门-客户端与服务端双向通信
服务端启动并指定连接数据读写逻辑 import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelInitializer;import io.netty.channel.EventLoopGroup;import io.netty.channel.nio.NioEventLoopGroup;import io.netty.chann..原创 2020-05-15 10:54:51 · 249 阅读 · 0 评论 -
Netty入门-客户端
服务端代码(解释以注释的形式体现):设置步骤:线程模型、IO模型,IO业务处理逻辑,连接import io.netty.bootstrap.Bootstrap;import io.netty.channel.Channel;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelInitializer;import io.netty.channel.ChannelOption;import io.net原创 2020-05-15 09:59:35 · 162 阅读 · 0 评论 -
Netty入门-服务端
IDEA引入netty: 或者引入依赖(推荐) <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.6.Final</version> </dependency>...原创 2020-05-15 09:17:59 · 381 阅读 · 0 评论 -
Netty--BIO、NIO、AIO模型
BIO:同步阻塞型:原生java io模型(JDK1.4之前),对服务器资源要求比较高,并发局限于应用中,程序简单易理解。NIO:同步非阻塞型:netty,适用于连接数多且连接比较短的应用AIO:异步非阻塞型:也叫NIO.2,JKD7开始支持。适用于连接数多且连接比较长的应用。和操作系统联系密切,目前应用不广泛...原创 2020-05-07 14:34:44 · 226 阅读 · 0 评论 -
NIO--SocketChanel和ServerSocketChannel实现简易群聊改造--主从多Reactor多线程模式
架构图:原创 2020-05-14 15:20:53 · 168 阅读 · 2 评论 -
NIO--SocketChanel和ServerSocketChannel实现简易群聊改造--单Reactor多线程模式
架构图: Reactor import java.net.InetSocketAddress;import java.nio.channels.SelectionKey;import java.nio.channels.Selector;import java.nio.channels.ServerSocketChannel;import java.nio.channels.SocketChannel;import java.util.Iterator;import j.原创 2020-05-13 13:06:45 · 395 阅读 · 0 评论 -
NIO--SocketChanel和ServerSocketChannel实现简易群聊改造--单Reactor单线程模式
架构图:服务端代码改造1 Reactorimport java.net.InetSocketAddress;import java.nio.channels.SelectionKey;import java.nio.channels.Selector;import java.nio.channels.ServerSocketChannel;import java.nio.channels.SocketChannel;import java.util.Iterator;publ原创 2020-05-13 10:03:25 · 182 阅读 · 0 评论 -
NIO--SocketChanel和ServerSocketChannel实现简易群聊
服务端代码 import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.SelectionKey;import java.nio.channels.Selector;import java.nio.channels.ServerSocketChannel;import java.nio.channels.SocketCha..原创 2020-05-13 08:49:54 · 619 阅读 · 0 评论 -
BIO--Socket和ServerSocket实现简易群聊
服务端代码 import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;import java.util.HashSet;import java.util.Set;import java.util.conc..原创 2020-05-11 15:44:05 · 155 阅读 · 0 评论 -
Netty--NIO.FileChannel之文件操作
读取文件示例 import java.io.File;import java.io.FileInputStream;import java.nio.ByteBuffer;import java.nio.channels.FileChannel;public class FileReadDemo { public static void main(String[] arg...原创 2020-05-08 11:06:48 · 633 阅读 · 0 评论 -
NIO--Socket通信
服务端代码:import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.*;import java.util.Iterator;import java.util.Set;public class ServerDemo { public static void main(String[] args) {原创 2020-05-09 12:20:47 · 154 阅读 · 0 评论