2021-07-04

Netty 简易实战,傻瓜都能看懂!

作者:rickiyang

出处:www.cnblogs.com/rickiyang/p/11074237.html

这一节我们来讲解Netty,使用Netty之前我们先了解一下Netty能做什么,无为而学,岂不是白费力气!

1.使用Netty能够做什么

  1. 开发异步、非阻塞的TCP网络应用程序;
  2. 开发异步、非阻塞的UDP网络应用程序;
  3. 开发异步文件传输应用程序;
  4. 开发异步HTTP服务端和客户端应用程序;
  5. 提供对多种编解码框架的集成,包括谷歌的Protobuf、Jboss marshalling、Java序列化、压缩编解码、
  6. 提供形式多样的编解码基础类库,可以非常方便的实现私有协议栈编解码框架的二次定制和开发;
  7. 基于职责链模式的Pipeline-Handler机制,用户可以非常方便的对网络事件进行拦截和定制;
  8. 所有的IO操作都是异步的,用户可以通过Future-Listener机制主动Get结果或者由IO线程操作完成之后主动Notify结果,用户的业务线程不需要同步等待;
  9. IP黑白名单控制;
  10. 打印消息码流;
  11. 流量控制和整形;
  12. 性能统计;
  13. 基于链路空闲事件检测的心跳检测

2. Netty常用类讲解

在这里我们就一些我们常用到的类做大致的讲解,然后再写入门程序的时候大致知道每一行都讲了什么。

EventLoop,EventLoopGroup

EventLoop目的是为Channel处理IO操作,一个EventLoop可以为多个Channel服务,EventLoopGroup会包含多个EventLoop。

BootStrap,ServerBootstrap

一个Netty应用通常由一个Bootstrap开始,它主要作用是配置整个Netty程序,串联起各个组件。

ChannelInitializer

当一个链接建立时,我们需要知道怎么来接收或者发送数据,当然,我们有各种各样的Handler实现来处理它,那么ChannelInitializer便是用来配置这些Handler,它会提供一个ChannelPipeline,并把Handler加入到ChannelPipeline。

Handler

为了支持各种协议和处理数据的方式,便诞生了Handler组件。Handler主要用来处理各种事件,这里的事件很广泛,比如可以是连接、数据接收、异常、数据转换等。

ChannelInboundHandler

一个最常用的Handler。这个Handler的作用就是处理接收到数据时的事件,也就是说,我们的业务逻辑一般就是写在这个Handler里面的,ChannelInboundHandler就是用来处理我们的核心业务逻辑。

Future

在Netty中所有的IO操作都是异步的,因此,你不能立刻得知消息是否被正确处理,但是我们可以过一会等它执行完成或者直接注册一个监听,具体的实现就是通过Future和ChannelFutures,他们可以注册一个监听,当操作执行成功或失败时监听会自动触发。总之,所有的操作都会返回一个ChannelFuture。

3. 第一个Helloworld

上面我们已经对常用类进行说明,下面我们就使用这些类来构建我们的第一个入门程序,本示例我使用的是maven来构建工程,如果你使用的是普通的项目则跳过第一步。

首先引入maven jar包:

<dependency>  <groupId>io.netty</groupId>  <artifactId>netty-all</artifactId>  <version>4.1.5.Final</version> </dependency>

下面我们来写客户端:

public class HelloWorldClient { private int port; private String address; public HelloWorldClient(int port,String address) {  this.port = port;  this.address = address; } public void start(){  EventLoopGroup group = new NioEventLoopGroup();  Bootstrap bootstrap = new Bootstrap();  bootstrap.group(group)    .channel(NioSocketChannel.class)    .handler(new ClientChannelInitializer());  try {   Channel channel = bootstrap.connect(address,port).sync().channel();   BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));   for(;;){    String msg = reader.readLine();    if(msg == null){     continue;    }        channel.writeAndFlush(msg + "\r\n");   }     } catch (Exception e) {   e.printStackTrace();  }finally {   group.shutdownGracefully();  } } public static void main(String[] args) {  HelloWorldClient client = new HelloWorldClient(7788,"127.0.0.1");  client.start(); }}

ChannelInitializer用来配置处理数据的handler:

public class ClientChannelInitializer extends ChannelInitializer<SocketChannel> { protected void initChannel(SocketChannel socketChannel) throws Exception {  ChannelPipeline pipeline = socketChannel.pipeline();  /*   * 这个地方的 必须和服务端对应上。否则无法正常解码和编码   *   * 解码和编码 我将会在下一节为大家详细的讲解。暂时不做详细的描述   *   * /    pipeline.addLast("decoder", new StringDecoder());  pipeline.addLast("encoder", new StringEncoder());  // 我们自己的handler  pipeline.addLast("handler", new HelloWorldClientHandler()); }}

写一个我们自己的handler,用自己的方式来处理数据:

public class HelloWorldClientHandler extends ChannelInboundHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {  System.out.println("server say : "+msg.toString()); } @Override public void channelActive(ChannelHandlerContext ctx) throws Exception {  System.out.println("Client is active"); } @Override public void channelInactive(ChannelHandlerContext ctx) throws Exception {  System.out.println("Client is close"); }}

客户端我们写完了,下面开始写服务器端:

public class HelloWordServer { private int port; public HelloWordServer(int port) {  this.port = port; } public void start(){  EventLoopGroup bossGroup = new NioEventLoopGroup();  EventLoopGroup workGroup = new NioEventLoopGroup();  ServerBootstrap server = new ServerBootstrap().group(bossGroup,workGroup)         .channel(NioServerSocketChannel.class)         .childHandler(new ServerChannelInitializer());  try {   ChannelFuture future = server.bind(port).sync();   future.channel().closeFuture().sync();  } catch (InterruptedException e) {   e.printStackTrace();  }finally {   bossGroup.shutdownGracefully();   workGroup.shutdownGracefully();  } } public static void main(String[] args) {  HelloWordServer server = new HelloWordServer(7788);  server.start(); }}

服务端的ChannelInitia......

原文转载:http://www.shaoqun.com/a/846141.html

跨境电商:https://www.ikjzd.com/

好卖家:https://www.ikjzd.com/w/776

acca是什么:https://www.ikjzd.com/w/1370

吉祥邮:https://www.ikjzd.com/w/1565


作者:rickiyang出处:www.cnblogs.com/rickiyang/p/11074237.html这一节我们来讲解Netty,使用Netty之前我们先了解一下Netty能做什么,无为而学,岂不是白费力气!1.使用Netty能够做什么开发异步、非阻塞的TCP网络应用程序;开发异步、非阻塞的UDP网络应用程序;开发异步文件传输应用程序;开发异步HTTP服务端和客户端应用程序;提供对多种编
dojo:https://www.ikjzd.com/w/2052
ishare:https://www.ikjzd.com/w/2308
春运进行时 -正在火车上的你,是否有回老家二三线城市做跨境电商的打算?:https://www.ikjzd.com/articles/15742
亚马逊仓库失火后,这项新技术正在推行:https://www.ikjzd.com/articles/15744
如何打造一个优秀的listing来带动产品的销量和转化率?:https://www.ikjzd.com/articles/15747
别再看仓库起火了!新政策让你连FBA仓库都进不去…:https://www.ikjzd.com/articles/15750
班上男生㖭我胸和下面 被同桌带到没人的地方做:http://lady.shaoqun.com/a/247501.html
三个男人一起弄我 一个吃奶两个㖭下面:http://lady.shaoqun.com/m/a/247612.html
用这种方式"拥抱"你的男人,对你是有真感情的!:http://lady.shaoqun.com/a/401721.html
已婚妇女晚上去领导家谈生意,看完电影被强奸。怎么惩罚他们?:http://lady.shaoqun.com/a/401722.html
女方打电话叫车,被性侵。当她睡着的时候,她用力拉着船头,不省人事:http://lady.shaoqun.com/a/401723.html
乳源一个一年级女生一天晚上和人开房,两次被强奸3:http://lady.shaoqun.com/a/401724.html

No comments:

Post a Comment