文档章节

netty3入门案例

Zero零_度
 Zero零_度
发布于 2017/06/02 18:02
字数 821
阅读 25
收藏 0

Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能、高可靠性的网络服务器和客户端程序。也就是说它是一个NIO框架,使用它可以简单快速地开发网络应用程序。Netty大大简化了网络程序的开发过程比如TCP和UDP的 Socket的开发。学习netty前需要对NIO理解得很透彻,可参考我另一篇文章java NIO或者网上找资料学习一下。

下面分别以类似HelloWorld的最基础案例来学习,案例是基于网络通信的。所以有Server端和Client端,当然客户端可以在本地使用telnet命令来测试。netty3和netty5版本在API上区别较大,下面是Netty3的一个例子。

Netty3 Server:

 

[java] view plain copy

  1. public class Server {  
  2.     public static void main(String[] args) {  
  3.         // 服务类,用于启动netty 在netty5中同样使用这个类来启动  
  4.         ServerBootstrap bootstrap = new ServerBootstrap();  
  5.         // 新建两个线程池  boss线程监听端口,worker线程负责数据读写  
  6.         ExecutorService boss = Executors.newCachedThreadPool();  
  7.         ExecutorService worker = Executors.newCachedThreadPool();  
  8.         // 设置niosocket工厂  类似NIO程序新建ServerSocketChannel和SocketChannel  
  9.         bootstrap.setFactory(new NioServerSocketChannelFactory(boss, worker));  
  10.         // 设置管道的工厂  
  11.         bootstrap.setPipelineFactory(new ChannelPipelineFactory() {  
  12.             @Override  
  13.             public ChannelPipeline getPipeline() throws Exception {  
  14.                 ChannelPipeline pipeline = Channels.pipeline();  
  15.                 pipeline.addLast("decoder", new StringDecoder());  
  16.                 pipeline.addLast("encoder", new StringEncoder());  
  17.                 pipeline.addLast("helloHandler", new HelloHandler());  //添加一个Handler来处理客户端的事件,Handler需要继承ChannelHandler  
  18.                 return pipeline;  
  19.             }  
  20.         });  
  21.         bootstrap.bind(new InetSocketAddress(10101));  
  22.         System.out.println("start!!!");  
  23.     }  
  24. }  

HelloHandler类:

 

 

[java] view plain copy

  1. public class HelloHandler extends SimpleChannelHandler {  
  2.     /** 接收消息*/  
  3.     @Override  
  4.     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {  
  5.         String s = (String) e.getMessage();  
  6.         System.out.println(s);  
  7.         //回写数据  
  8.         ctx.getChannel().write("HelloWorld");  
  9.         super.messageReceived(ctx, e);  
  10.     }  
  11.     /** 捕获异常*/  
  12.     @Override  
  13.     public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {  
  14.         System.out.println("exceptionCaught");  
  15.         super.exceptionCaught(ctx, e);  
  16.     }  
  17.     /** 新连接*/  
  18.     @Override  
  19.     public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {  
  20.         System.out.println("channelConnected");  
  21.         super.channelConnected(ctx, e);  
  22.     }  
  23.     /** 必须是链接已经建立,关闭通道的时候才会触发  */  
  24.     @Override  
  25.     public void channelDisconnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {  
  26.         System.out.println("channelDisconnected");  
  27.         super.channelDisconnected(ctx, e);  
  28.     }  
  29.     /** channel关闭的时候触发 */  
  30.     @Override  
  31.     public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {  
  32.         System.out.println("channelClosed");  
  33.         super.channelClosed(ctx, e);  
  34.     }  
  35. }  

到这里就可以启动Server端了。

 

netty3 Client:

[java] view plain copy

  1. public class Client {  
  2.     public static void main(String[] args) {  
  3.         // 客户端的启动类  
  4.         ClientBootstrap bootstrap = new  ClientBootstrap();  
  5.         //线程池  
  6.         ExecutorService boss = Executors.newCachedThreadPool();  
  7.         ExecutorService worker = Executors.newCachedThreadPool();  
  8.         //socket工厂  
  9.         bootstrap.setFactory(new NioClientSocketChannelFactory(boss, worker));  
  10.         //管道工厂  
  11.         bootstrap.setPipelineFactory(new ChannelPipelineFactory() {  
  12.             @Override  
  13.             public ChannelPipeline getPipeline() throws Exception {  
  14.                 ChannelPipeline pipeline = Channels.pipeline();  
  15.                 pipeline.addLast("decoder", new StringDecoder());  
  16.                 pipeline.addLast("encoder", new StringEncoder());  
  17.                 pipeline.addLast("hiHandler", new HiHandler());  
  18.                 return pipeline;  
  19.             }  
  20.         });  
  21.         //连接服务端  
  22.         ChannelFuture connect = bootstrap.connect(new InetSocketAddress("127.0.0.1", 10101));  
  23.         Channel channel = connect.getChannel();  
  24.         System.out.println("client start");  
  25.         Scanner scanner = new Scanner(System.in);  
  26.         while(true){  
  27.             System.out.println("请输入");  
  28.             channel.write(scanner.next());  
  29.         }  
  30.     }  
  31. }  

客户端不断等待终端输入并写入通道。服务端接收到新的输入后会获取到输入的信息。对服务端的回写客户端也需要一个Handler来处理。下面是这客户端HiHandler的代码

 

 

[java] view plain copy

  1. public class HiHandler extends SimpleChannelHandler {  
  2.     /** 接收消息*/  
  3.     @Override  
  4.     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {  
  5.         String s = (String) e.getMessage();  
  6.         System.out.println(s);  
  7.         super.messageReceived(ctx, e);  
  8.     }  
  9.     /** 捕获异常*/  
  10.     @Override  
  11.     public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {  
  12.         System.out.println("exceptionCaught");  
  13.         super.exceptionCaught(ctx, e);  
  14.     }  
  15.     /** 新连接*/  
  16.     @Override  
  17.     public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {  
  18.         System.out.println("channelConnected");  
  19.         super.channelConnected(ctx, e);  
  20.     }  
  21.     /** 必须是链接已经建立,关闭通道的时候才会触发*/  
  22.     @Override  
  23.     public void channelDisconnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {  
  24.         System.out.println("channelDisconnected");  
  25.         super.channelDisconnected(ctx, e);  
  26.     }  
  27.     /** channel关闭的时候触发*/  
  28.     @Override  
  29.     public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {  
  30.         System.out.println("channelClosed");  
  31.         super.channelClosed(ctx, e);  
  32.     }  
  33. }  

至此就完成了Netty3的一个最基础的例子。

本文转载自:http://blog.csdn.net/zhang19910814/article/details/51548754

Zero零_度
粉丝 69
博文 1258
码字总数 257684
作品 0
程序员
私信 提问
netty3 UDP 组播问题

用netty3实现组播的服务器端代码,只能在linux上使用(win下无法接受组播)netty3有别于JAVA原始UDP组播实现方式 使用netty3实现组播同时还用绑定一个组播的本地端口(同组播端口一样的本地端...

蓝色火焰
2015/08/03
489
1
Android与MINA2、Netty4的跨平台UDP双向通信实战

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

JackJiang-
2016/06/30
804
1
NIO框架入门(三):iOS与MINA2、Netty4的跨平台UDP双向通信实战

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

JackJiang-
2016/06/28
627
0
NIO框架入门(二):服务端基于MINA2的UDP双向通信Demo演示

前言 NIO框架的流行,使得开发大并发、高性能的互联网服务端成为可能。这其中最流行的无非就是MINA和Netty了,MINA目前的主要版本是MINA2、而Netty的主要版本是Netty3和Netty4(Netty5已经被...

JackJiang-
2016/06/24
488
0
dubbo中的那些“坑"(3)-netty4-rpc网络接口中的高并发的bug

在几个月前改造dubbo时,netty4已经稳定很久了,一时手痒,按照netty3-rpc的源码克隆了一套netty4,在修正了大量的包、类型不同之后,基本保持了netty3的风格,并发量小或者数据包很小时,一...

阿阮
2014/12/02
0
10

没有更多内容

加载失败,请刷新页面

加载更多

首次揭秘:阿里巴巴中间件在 Serverless 技术领域的探索

Serverless 话题涉及范围极广,几乎包含了代码管理、测试、发布、运维和扩容等与应用生命周期关联的所有环节。AWS Lambda 是 Serverless 领域的标志性产品,但如果将其应用于核心业务,可能会...

阿里云官方博客
15分钟前
0
0
Python免踩坑指南

最近我发现GitHub上中文项目越来越多,真实令人欣喜的事情啊。不知道小伙伴们有没有发布自己的GitHub精品项目,觉得自信的可以拿出来,推荐给其他小伙伴哦。 好了,话不多说今天的GitHub精推...

编程资源库
28分钟前
0
0
微信授权域名

https://www.jianshu.com/p/9ce837f20740

Js_Mei
28分钟前
0
0
115.两种格式磁盘扩容、调整内存和cpu、迁移虚拟机

28.12 磁盘扩容(raw) 28.13 磁盘扩容(qcow2) 28.14 调整cpu内存和网卡 28.15 迁移虚拟机 28.12 磁盘扩容(raw) 针对一块已经存在的盘进行增加容量 1.qemu-img resize /kvm_data/aminglinux02...

Axin-linux
30分钟前
0
0
好程序员java分享spring框架精讲

1、什么是Spring框架?Spring框架有哪些主要模块? Spring框架是一个为Java应用程序的开发提供了综合、广泛的基础性支持的Java平台。Spring帮助开发者解决了开发中基础性的问题,使得开发人员...

好程序员IT
38分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部