文档章节

netty框架

刘付kin
 刘付kin
发布于 2016/12/07 12:14
字数 731
阅读 143
收藏 1

#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();
 }
}

© 著作权归作者所有

共有 人打赏支持
刘付kin
粉丝 6
博文 100
码字总数 72832
作品 0
深圳
为什么Netty这么火?与Mina相比有什么优势?

image Netty是什么?为什么这么火? Netty是目前最流行的由JBOSS提供的一个Java开源框架NIO框架,Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服...

架构之路
01/04
0
0
书籍推荐:《Netty权威指南》

《Netty权威指南》是异步非阻塞通信领域的经典之作,基于最新版本Netty 5.0编写,是国内首本深入介绍Netty原理和架构的技术书籍,也是作者多年实战经验的总结和浓缩。在理论方面,讲解了Net...

ddddd8
2017/12/05
0
0
Netty 3.2.4 Final 发布,NIO网络框架

netty 3.2.4 final 发布,距离上一个版本3.2.3 final 足足相隔了近3个月时间,不能不说netty 更新脚步变慢了。 netty 似乎没有什么内容更新的,再扩展基本也是在decoder,encoder 上做文章,NI...

demon
2011/02/18
2.1K
0
NIO框架入门(三):iOS与MINA2、Netty4的跨平台UDP双向通信实战

前言 本文将演示一个iOS客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo。服务端将分别用MINA2和Netty4进行实现,而通信时服务端你只需选其一就行了。同时...

JackJiang-
2016/06/28
547
0
Android与MINA2、Netty4的跨平台UDP双向通信实战

概述 本文演示的是一个Android客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo。 当前由于NIO框架的流行,使得开发大并发、高性能的互联网服务端成为可能。...

JackJiang-
2016/06/30
751
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

谷歌 Fuchsia 上手体验,将取代Android/win10

在手机市场领域,Google表现很抢眼,毫无疑问,Android 至今在移动操作系统的市场份额占据绝对领先地位,但是 Android 仍然存在不少问题,碎片化问题严重,在平板以及大屏幕设备上表现糟糕,...

linux-tao
25分钟前
1
0
List、Array与ArrayList

数组在内存中是连续存储的,所以它的索引速度很快,而且赋值和修改元素也非常快,比如: string[] s=new string[3];//赋值 s[0]="a"; s[1]="b"; s[2]="c";//修改 s[1]="b1"; 但是数组...

shimmerkaiye
27分钟前
0
0
Linux 的Lnmp环境下为mysql添加环境变量

一.问题 在Linux 安装完Lnmp 环境后 , 连接Mysql 告诉没有这条命令 mysql -uroot -p 命令失效 因为是源码安装的,所以会出现这样的的原因 。集成环境是不会出现的。 其实很简单,只需要给m...

15834278076
29分钟前
3
0
apolloxlua include函数

include函数不是单独使用的函数, 他并不是标准库的一部分, 你可以使用include函数将某个后缀为 .aop的文档包含到你的文档流中。 因为include是单独处理流, 所以不会在主处理流程中有所表示...

钟元OSS
33分钟前
0
0
【转载分享】做一名较真的工程师

近些年与我共事过的同事,一定知道我至今仍有一个较真的性格。我会:指出同事所写代码的不当命名问题(并帮助改进);指出同事所写文档中的逻辑混乱问题(并辅以修订);指出同事所写PPT中乱...

HellerZhang
35分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部