Netty框架初探

原创 2015年11月19日 14:52:24

最近因为功能设计到TCP传输,所以准备研究一下Netty框架的使用。

初次使用,先写一个最简单的Netty通讯,后面会对一些具体的细节进行说明。

声明几个变量

private static final int BIZGROUPSIZE = Runtime.getRuntime().availableProcessors()*2;
		private static final int BIZTHREADSIZE = 100;
		private static final EventLoopGroup bossGroup = new NioEventLoopGroup(BIZGROUPSIZE);
		private static final EventLoopGroup workerGroup = new NioEventLoopGroup(BIZTHREADSIZE);

		//服务端
		ServerBootstrap serverBootstrap;
		//客户端
		Bootstrap clientBootstrap;
		//客户端通道
		Channel clientChannel;
		//服务端通道
		Channel serverChannel ;

服务端代码

		public class NettyServer{
			public void init(){
				serverBootstrap = new ServerBootstrap();
				serverBootstrap.group(bossGroup, workerGroup);
				serverBootstrap.channel(NioServerSocketChannel.class);
				//添加handler监听服务端的IO动作
				serverBootstrap.handler(new OutHandler());
				serverBootstrap.childHandler(new ChannelInitializer<Channel>(){

					@Override
					protected void initChannel(Channel arg0)
							throws Exception {
						// TODO Auto-generated method stub
						ChannelPipeline pipeline = arg0.pipeline();
						pipeline.addLast(new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, 0, 4, 0, 4));
						pipeline.addLast(new LengthFieldPrepender(4));
						pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8));
						pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8));
						//添加handler监听客户端Channel的状态变化
						pipeline.addLast(new TcpServerHandler());
					}
					
				});
				try {
					//服务端启动
					ChannelFuture cf = serverBootstrap.bind(getLocalHostIp(),5656).sync();
					Toast.makeText(getActivity(), "TCP服务器已启动", Toast.LENGTH_SHORT).show();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}

客户端代码

		public class NettyClient{
			EventLoopGroup group = new NioEventLoopGroup();
			public void init(){
				Bootstrap b = new Bootstrap();
				b.group(group);
				b.channel(NioSocketChannel.class).option(ChannelOption.TCP_NODELAY, true);
				b.handler(new ChannelInitializer<SocketChannel>() {
				     @Override
				     protected void initChannel(SocketChannel ch) throws Exception {
				         ChannelPipeline pipeline = ch.pipeline();
				         	pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, 0, 4, 0, 4));
							pipeline.addLast("frameEncoder", new LengthFieldPrepender(4));
							pipeline.addLast("decoder", new StringDecoder(CharsetUtil.UTF_8));
							pipeline.addLast("encoder", new StringEncoder(CharsetUtil.UTF_8));
							 //添加一个Hanlder用来处理各种Channel状态
							pipeline.addLast("handlerIn", new ClientHandler());
							 //添加一个Handler用来接收监听IO操作的
							pipeline.addLast("handlerOut", new OutHandler());
				     }
				 });
				ChannelFuture f;
				try {
					//连接服务端
				f = b.connect(getLocalHostIp(), 5656).sync();
				serverChannel = f.channel();
				serverChannel.writeAndFlush("<<<<<<<<<<<<<<<<客户端请求连接>>>>>>>>>>>>>>>>");
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}

服务端绑定的Handler

		public class TcpServerHandler extends ChannelInboundHandlerAdapter {
		     @Override
		     public void channelRead(ChannelHandlerContext ctx, Object msg)
		             throws Exception {
		         // TODO Auto-generated method stub
		         System.out.println("<<<<<<<<<<<<<<<<收到客户端消息 :"+ msg);
		         ctx.channel().writeAndFlush("<<<<<<<<<<服务端已经接收:" + msg);
		     }
		     @Override
		     public void channelActive(ChannelHandlerContext ctx) throws Exception {
		         // TODO Auto-generated method stub
		         System.out.println("通道已经启用>>>>>>>>");
		         clientChannel = ctx.channel();
		     }
		       @Override
		    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
		         System.out.println("exception is general");
		     }
		}

客户端绑定的Handler

		public class ClientHandler extends ChannelInboundHandlerAdapter {
		    @Override
		    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
		        System.out.println("<<<<<<<<<客户端收到消息:" + msg);
		    }

		    @Override
		    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
		        System.out.println("client exception is general");
		    }
		}
两端共用的Handler

		public class OutHandler extends ChannelOutboundHandlerAdapter{
			@Override
			public void connect(ChannelHandlerContext ctx,
					SocketAddress remoteAddress, SocketAddress localAddress,
					ChannelPromise promise) throws Exception {
				// TODO Auto-generated method stub
				super.connect(ctx, remoteAddress, localAddress, promise);
				System.out.println("<<<<<<<<<<<<<<< connect server success >>>>>>>>>>>>>>>>");
			}

			@Override
			public void bind(ChannelHandlerContext ctx,
					SocketAddress localAddress, ChannelPromise promise)
					throws Exception {
				// TODO Auto-generated method stub
				super.bind(ctx, localAddress, promise);
				System.out.println("<<<<<<<<<<<<<<< server bind success >>>>>>>>>>>>>>>>");
			}
		}



启动

//启动服务端
new NettyServer().init();
//启动客户端
new NettyClient().init();


发送消息

//向服务端发消息
serverChannel.writeAndFlush("<<<<<<<<<<<<<我是客户端>>>>>>>>>>>>>");
//向客户端发消息
clientChannel.writeAndFlush("<<<<<<<<<<<<<我是服务端>>>>>>>>>>>>>");


至此一个收发通道就连通了。


版权声明:本文为博主原创文章,未经博主允许不得转载。

Netty4详解三:Netty架构设计

读完这一章,我们基本上可以了解到Netty所有重要的组件,对Netty有一个全面的认识,这对下一步深入学习Netty是十分重要的,而学完这一章,我们其实已经可以用Netty解决一些常规的问题了。 ...
  • suifeng3051
  • suifeng3051
  • 2014年06月06日 10:52
  • 25165

Java NIO框架Netty教程(一) – Hello Netty

先啰嗦两句,如果你还不知道Netty是做什么的能做什么。那可以先简单的搜索了解一下。我只能说Netty是一个NIO的框架,可以用于开发分布式的Java程序。具体能做什么,各位可以尽量发挥想象。技术,是...
  • kobejayandy
  • kobejayandy
  • 2013年09月09日 22:05
  • 243745

Netty框架的学习经历初级篇---helloworld

每一个程序猿都对helloworld有一段特殊的感情! 我的学习也是从一段helloworld代码开始的。一开始下载了一个pdf版的netty权威指南,该书是以netty5.0版本讲述的,到nett...
  • chuanren1991
  • chuanren1991
  • 2016年10月26日 11:51
  • 1619

Netty学习:搭建一个简单的Netty服务(JAVA NIO 类库的异步通信框架)

http://wosyingjun.iteye.com/blog/2303296 Netty学习:搭建一个简单的Netty服务 Netty 是一个基于 JAVA NIO 类库的异步通信框架...
  • zzy7075
  • zzy7075
  • 2016年08月02日 16:54
  • 13415

为什么选择Netty作为基础通信框架?

在开始之前,我先讲一个亲身经历的故事:曾经有两个项目组同时用到了NIO编程技术,一个项目组选择自己开发NIO服务端,直接使用JDK原生的API,结果两个多月过去了,他们的NIO服务端始终无法稳定,问题...
  • broadview2006
  • broadview2006
  • 2015年05月27日 09:33
  • 6448

Netty框架

Netty框架新版本:3.0.2.GA,于2008年11月19日发布。Netty项目致力于提供一个异步的、事件驱动的网络应用框架和工具,用于快速开发可维护的、高性能的、高扩展性的服务器和客户端之间的协...
  • chszs
  • chszs
  • 2008年11月22日 00:33
  • 9375

Java NIO框架Mina、Netty、Grizzly介绍与对比

Java NIO框架Mina、Netty、Grizzly介绍与对比原文链接:http://www.24xuexi.com/w/2011-11-14/98277.html原文日期:2011年11月14日...
  • Poechant
  • Poechant
  • 2012年12月26日 17:10
  • 21859

Netty框架实现简单的组播

在游戏中会经常遇到这一种情况,就是
  • u014489596
  • u014489596
  • 2014年10月30日 11:40
  • 2485

一起学Netty(一)之 Hello Netty

四月份花了大概一个月的时间翻译了2015年12月出版的《Netty in Action》 说实话,翻译完了,感觉只是对Netty有了一些初步的了解,对Netty的模型在脑海中也是有了初步的雏形,好记性...
  • linuu
  • linuu
  • 2016年05月07日 17:13
  • 8417

netty 学习记录一

netty
  • zhuyijian135757
  • zhuyijian135757
  • 2014年07月20日 00:53
  • 6673
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Netty框架初探
举报原因:
原因补充:

(最多只允许输入30个字)