`
chenjunfei0617
  • 浏览: 5962 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

Netty Serial 1:入门应用

阅读更多
一:Netty简介
  Netty是目前最流行的NIO框架之一,它的健壮性、功能、性能、可定制性和扩展性在同类框架中都是首屈一指的,目前流行的Hadoop的RPC框架avro使用Netty作为底层通信框架,它的主要优点有:
1、开发门槛低;
2、功能强大,支持多种主流协议;
3、性能高,成熟稳定;
4、定制能力强。

二:Netty入门应用
  本节以时间服务器为例进行开发,客户端发送一个命令请求,服务器端接受命令返回当前日期给客户端,本节主要包括的内容有:
1、环境搭建
2、服务器端开发
3、客户端开发
4、测试

1、环境搭建:
  可以通过maven来构建,也可以直接将netty的jar包导入到classpath中。
  maven构建:
  <dependency>
        <groupId>io.netty</groupId>
        <artifactId>netty-all</artifactId>
        <version>5.0.0.Alpha2</version>
  </dependency>
 
  jar包方式:到官网http://netty.io/downloads.html下载相应的开发包,解压,将\%nettyhome%\jar\all-in-one\目录下的jar导入到classpath即可

2、服务器端开发

TimeServer:时间服务器
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;

public class TimeServer {
	public void bind(int port) {
		EventLoopGroup bossGroup = new NioEventLoopGroup();
		EventLoopGroup workerGroup = new NioEventLoopGroup();
		try {
			ServerBootstrap bootstrap = new ServerBootstrap();
			bootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)
					.option(ChannelOption.SO_BACKLOG, 1024).childHandler(new ChildChannelHandler());

			ChannelFuture f = bootstrap.bind(port).sync();

			f.channel().closeFuture().sync();
		} catch (Exception e) {
			// TODO: handle exception
		} finally {
			bossGroup.shutdownGracefully();
			workerGroup.shutdownGracefully();
		}
	}

	public static void main(String[] args) {
		new TimeServer().bind(8080);
	}
}

class ChildChannelHandler extends ChannelInitializer<SocketChannel> {
	@Override
	protected void initChannel(SocketChannel arg0) throws Exception {
		// TODO Auto-generated method stub
		arg0.pipeline().addLast(new TimeServerHandler());
	}
}



TimeServerHandler:时间服务端处理器
import java.util.Date;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerAdapter;
import io.netty.channel.ChannelHandlerContext;

public class TimeServerHandler extends ChannelHandlerAdapter{

	@Override
	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
		// TODO Auto-generated method stub
		ByteBuf buf = (ByteBuf) msg;
		byte[] req = new byte[buf.readableBytes()];
		buf.readBytes(req);
		String body = new String(req, "UTF-8");
		System.out.println("the time server receive order :" + body);
		String currentyTime = "QUERY TIME ORDER".equalsIgnoreCase(body)?new Date(System.currentTimeMillis()).toString():"BAD ORDER";
		ByteBuf copiedBuffer = Unpooled.copiedBuffer(currentyTime.getBytes());
		ctx.write(copiedBuffer);
	}
	
	@Override
	public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
		// TODO Auto-generated method stub
		ctx.flush();	
	}
	
	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
		// TODO Auto-generated method stub
		ctx.close();
	}
}


3、客户端开发

TimeClient:客户端
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;

public class TimeClient {

	public void connect(String host,int port){
		EventLoopGroup group = new NioEventLoopGroup();
		try {
			Bootstrap bootstrap = new Bootstrap();
			bootstrap.group(group).channel(NioSocketChannel.class)
			.option(ChannelOption.TCP_NODELAY, true).handler(new ChannelInitializer<SocketChannel>() {
				protected void initChannel(SocketChannel s) throws Exception {
					
					s.pipeline().addLast(new TimeClienHandler());
				};
			});
				ChannelFuture f = bootstrap.connect(host, port).sync();
			
			f.channel().closeFuture().sync();
		} catch (Exception e) {
			// TODO: handle exception
		} finally {
			group.shutdownGracefully();
		}
	}
	public static void main(String[] args) {
		new TimeClient().connect("127.0.0.1", 8080);
	}
}

TimeClienHandler:时间客户端处理器
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerAdapter;
import io.netty.channel.ChannelHandlerContext;

public class TimeClienHandler extends ChannelHandlerAdapter {

	private final ByteBuf buf;

	public TimeClienHandler() {
		byte[] req = "QUERY TIME ORDER".getBytes();
		buf = Unpooled.buffer(req.length);
		buf.writeBytes(req);
	}

	@Override
	public void channelActive(ChannelHandlerContext ctx) throws Exception {
		// TODO Auto-generated method stub
		ctx.writeAndFlush(buf);
	}

	@Override
	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
		// TODO Auto-generated method stub
		ByteBuf buf = (ByteBuf) msg;
		byte[] req = new byte[buf.readableBytes()];
		buf.readBytes(req);
		String body = new String(req, "UTF-8");
		System.out.println("now is :" + body);
	}

	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
		// TODO Auto-generated method stub
		ctx.close();
	}
}


4、测试
先运行服务器TimeServer,然后运行TimeClient
服务器端收到:
the time server receive order :QUERY TIME ORDER

客户端收到:
now is :Fri Sep 18 10:05:36 CST 2015

0
2
分享到:
评论

相关推荐

    netty-all-4.1.68.Final-API文档-中文版.zip

    赠送jar包:netty-all-4.1.68.Final.jar; 赠送原API文档:netty-all-4.1.68.Final-javadoc.jar; 赠送源代码:netty-all-4.1.68.Final-sources.jar; 赠送Maven依赖信息文件:netty-all-4.1.68.Final.pom; 包含...

    Netty 入门与实战:仿写微信 IM 即时通讯系统.pdf

    ### Netty 入门与实战:仿写微信 IM 即时通讯系统 #### 一、引言 随着移动互联网技术的飞速发展,即时通讯(IM)应用已成为人们日常生活中不可或缺的一部分。微信作为中国最成功的即时通讯软件之一,其背后的架构和...

    netty服务器通讯说明: 服务器条件NETTY框架编程: 服务器IP:192.168.2.106 端口8810

    netty服务器通讯说明: 服务器条件NETTY框架编程: 服务器IP:192.168.2.106 端口8810 数据传输的方式:从串口接收到一条完整的协议数据,计算出数据字节长度,打包成HtAlingProtocol类,并发送给服务器; package ...

    Netty 入门与实战:仿写微信 IM 即时通讯系统

    在本文中,我们将深入探讨Netty框架,并通过实战项目——仿写微信IM即时通讯系统,来深入了解其在高性能网络应用中的应用。Netty是Java领域中一个高效的异步事件驱动的网络应用程序框架,它为快速开发可维护的高性能...

    Netty入门与实战:仿写微信IM即时通讯系统

    ### Netty入门与实战:仿写微信IM即时通讯系统 #### 一、引言 随着移动互联网技术的飞速发展,即时通讯(IM)系统已成为人们日常生活中不可或缺的一部分。微信作为国内最受欢迎的即时通讯软件之一,其高效稳定的通信...

    netty-all-4.1.27.Final-API文档-中文版.zip

    赠送jar包:netty-all-4.1.27.Final.jar; 赠送原API文档:netty-all-4.1.27.Final-javadoc.jar; 赠送源代码:netty-all-4.1.27.Final-sources.jar; 赠送Maven依赖信息文件:netty-all-4.1.27.Final.pom; 包含...

    Netty 入门与实战:仿写微信 IM 即时通讯系统.zip

    总之,《Netty 入门与实战:仿写微信 IM 即时通讯系统》是一本全面介绍Netty在即时通讯领域应用的教程,适合对网络编程、Java后端开发和即时通讯感兴趣的开发者阅读。通过学习本书,读者不仅可以掌握Netty的使用,还...

    netty-common-4.1.65.Final-API文档-中英对照版.zip

    赠送jar包:netty-common-4.1.65.Final.jar; 赠送原API文档:netty-common-4.1.65.Final-javadoc.jar; 赠送源代码:netty-common-4.1.65.Final-sources.jar; 赠送Maven依赖信息文件:netty-common-4.1.65.Final....

    Netty 入门与实战:仿写微信 IM 即时通讯系统.rar

    Netty 入门与实战:仿写微信 IM 即时通讯系统,掘金小册子,netty教程。章节齐全无缺失,排版非常不错。 1.仿微信IM系统简介 1 2.Netty是什么? 2 3.服务端启动流程 8 4.客户端启动流程 11 5.实战:客户端与服务端双向...

    netty-common-4.1.68.Final-API文档-中文版.zip

    赠送jar包:netty-common-4.1.68.Final.jar; 赠送原API文档:netty-common-4.1.68.Final-javadoc.jar; 赠送源代码:netty-common-4.1.68.Final-sources.jar; 赠送Maven依赖信息文件:netty-common-4.1.68.Final....

    netty-all-4.1.5.Final完整pom.xml文件配置

    1. **非阻塞I/O**:Netty基于Java NIO(Non-blocking I/O)实现,允许在一个线程中处理多个连接,提高了系统的资源利用率和并发能力。 2. **零拷贝**:通过使用Direct Buffer和FileChannel.transferTo方法,Netty...

    netty-transport-4.1.73.Final-API文档-中英对照版.zip

    赠送jar包:netty-transport-4.1.73.Final.jar; 赠送原API文档:netty-transport-4.1.73.Final-javadoc.jar; 赠送源代码:netty-transport-4.1.73.Final-sources.jar; 赠送Maven依赖信息文件:netty-transport-...

    Netty进阶之路:跟着案例学Netty 完整版.pdf

    《Netty进阶之路:跟着案例学Netty》中的案例涵盖了Netty的启动和停止、内存、并发多线程、性能、可靠性、安全等方面,囊括了Netty绝大多数常用的功能及容易让人犯错的地方。在案例的分析过程中,还穿插讲解了Netty...

    netty-all-4.1.68.Final-API文档-中英对照版.zip

    赠送jar包:netty-all-4.1.68.Final.jar; 赠送原API文档:netty-all-4.1.68.Final-javadoc.jar; 赠送源代码:netty-all-4.1.68.Final-sources.jar; 赠送Maven依赖信息文件:netty-all-4.1.68.Final.pom; 包含...

    netty-transport-4.1.27.Final-API文档-中英对照版.zip

    赠送jar包:netty-transport-4.1.27.Final.jar; 赠送原API文档:netty-transport-4.1.27.Final-javadoc.jar; 赠送源代码:netty-transport-4.1.27.Final-sources.jar; 赠送Maven依赖信息文件:netty-transport-...

    netty-resolver-4.1.65.Final-API文档-中文版.zip

    赠送jar包:netty-resolver-4.1.65.Final.jar; 赠送原API文档:netty-resolver-4.1.65.Final-javadoc.jar; 赠送源代码:netty-resolver-4.1.65.Final-sources.jar; 赠送Maven依赖信息文件:netty-resolver-4.1.65...

    netty-codec-4.1.74.Final-API文档-中文版.zip

    赠送jar包:netty-codec-4.1.74.Final.jar; 赠送原API文档:netty-codec-4.1.74.Final-javadoc.jar; 赠送源代码:netty-codec-4.1.74.Final-sources.jar; 赠送Maven依赖信息文件:netty-codec-4.1.74.Final.pom;...

    netty结合disruptor队列实现即时通信

    netty结合disruptor队列实现即时通信1、简介使用disruptor改造netty通讯,使提高吞吐率,主要是提供disruptor如何与netty整合的思路2、软件架构spring-boot2.7.3 + netty4.1.36.Final + disruptor + jdk1.83、源码...

Global site tag (gtag.js) - Google Analytics