netty框架
netty框架
刘付kin 发表于1年前
netty框架
  • 发表于 1年前
  • 阅读 131
  • 收藏 1
  • 点赞 0
  • 评论 0

移动开发云端新模式探索实践 >>>   

#Netty的介绍:

netty是基于NIO的同步非阻塞框架。原生API中,服务器端只有一个主线程在轮询Selector,当有大量的客户端向服务器端发起:连接请求,传输信息请求等的时候,一个线程轮询不能够快速的响应。这个时候就需要利用多线程组来处理,引入多线程组就需要解决多线程同步的问题。就是有这样的需求,netty框架应运而生。

它包括两部分信息:

  • 1.)两个事件组。

      bosseventloopGroup:轮询Selector,拿到key后不处理,直接丢给workeventloopGroup
      workeventloopGroup:具体处理selectionKey。
    
  • 2.)一个管道流水线。(用户只需要关注这一块)

在流水线上绑定自己的业务流程即可。这些业务类需要继承一下之一:

===>ChannelInboundHandlerAdapter

===>ChannelOutboundHandlerAdapter

===>SimpleChannelInboundHandler<ByteBuf> 

===>ByteToMessageDecoder    
(这个一般用于ByteBuf ==>  对象的时候,也就是  输入的最先解码)

===>MessageToByteEncoder 
(这个一般用于对象==>  ByteBuf 的时候,也就是  输出的最后编码)

ctx.fireChannelRead(request);和ctx.writeAndFlush(response);区别

ctx.fireChannelRead(response);
是发送给下一个ChannelInboundHandlerAdapter处理器
,也就是如果你的ChannelInboundHandlerAdapter还没有处理完的时候,
会继续传给下一个ChannelInboundHandlerAdapter,

比如:解码后的信息传给下一个ChannelInboundHandlerAdapter。

ctx.writeAndFlush(request);
是真正发送到输出管道上的信息,
不管你后面还有没有ChannelInboundHandlerAdapter,
都不会给这个ChannelInboundHandlerAdapter处理了,
只会给ChannelOutboundHandlerAdapter的类处理。

输入图片说明

#具体的代码实现

NettyServer

package org.java.io.netty;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.Channel;
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.nio.NioServerSocketChannel;

public class NettyServer {

 public void startServer(){
  EventLoopGroup eventLoopGroup = null;
  ServerBootstrap serverBootstrap = new ServerBootstrap();
  eventLoopGroup = new NioEventLoopGroup();
  
  serverBootstrap.group(eventLoopGroup)
        .channel(NioServerSocketChannel.class)
        .localAddress("localhost", 4700)
        .childHandler(new ChannelInitializer<Channel>() {
        [@Override](https://my.oschina.net/u/1162528)
        protected void initChannel(Channel channel) throws Exception {
         // TODO Auto-generated method stub
         channel.pipeline().addLast(new InputDecodeHandler1());
         channel.pipeline().addLast(new OutputDecodeHandler2());
         channel.pipeline().addLast(new OutputDecodeHandler1());
         channel.pipeline().addLast(new InputDecodeHandler2());
        }
        });
  //上面做了那么多,就只是为了组装serverBootstrap的对象,下面才是真正的去连接服务器。
  try {
   //sync()的作用是为了让服务器等待绑定完成才能够往下走,否则还没有绑定成功就往下走了,就会出错。
   ChannelFuture channelFuture = serverBootstrap.bind().sync();
   System.out.println("服务器启动了!!!======> 4700");
   //连接完成后,不能够让这个主线程退出的,否则的话,eventLoopGroup中的bossgroup和workgroup线程组也会退出,
   //所以需要让他在这里等待,为什么不用sleep()呢?你知道服务器要运行多久吗?不知道吧,不知道就用一个等待外部的触发来实现。
   channelFuture.channel().closeFuture().sync();
   eventLoopGroup.shutdownGracefully().sync();
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
 
 public static void main(String[] args) {
  new NettyServer().startServer();
 }
}

NettyClient

package org.java.io.netty;

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
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.nio.NioSocketChannel;

public class NettyClient {

 public void connectToServer(){
  EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
  
  Bootstrap bootstrap = new Bootstrap();
  bootstrap.group(eventLoopGroup)
     .channel(NioSocketChannel.class)
     .remoteAddress("localhost", 4700)
     .handler(new ChannelInitializer<Channel>() {
     [@Override](https://my.oschina.net/u/1162528)
     protected void initChannel(Channel channel) throws Exception {
      // TODO Auto-generated method stub
      channel.pipeline().addLast(new ClientHandler());
     }
    });
  try {
   ChannelFuture channelFuture = bootstrap.connect().sync();
   channelFuture.channel().closeFuture().sync();
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
 
 public static void main(String[] args) {
  new NettyClient().connectToServer();
 }
}
标签: Netty
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 6
博文 100
码字总数 72832
×
刘付kin
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: