一: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
分享到:
相关推荐
赠送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 即时通讯系统 #### 一、引言 随着移动互联网技术的飞速发展,即时通讯(IM)应用已成为人们日常生活中不可或缺的一部分。微信作为中国最成功的即时通讯软件之一,其背后的架构和...
netty服务器通讯说明: 服务器条件NETTY框架编程: 服务器IP:192.168.2.106 端口8810 数据传输的方式:从串口接收到一条完整的协议数据,计算出数据字节长度,打包成HtAlingProtocol类,并发送给服务器; package ...
在本文中,我们将深入探讨Netty框架,并通过实战项目——仿写微信IM即时通讯系统,来深入了解其在高性能网络应用中的应用。Netty是Java领域中一个高效的异步事件驱动的网络应用程序框架,它为快速开发可维护的高性能...
### Netty入门与实战:仿写微信IM即时通讯系统 #### 一、引言 随着移动互联网技术的飞速发展,即时通讯(IM)系统已成为人们日常生活中不可或缺的一部分。微信作为国内最受欢迎的即时通讯软件之一,其高效稳定的通信...
赠送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 即时通讯系统》是一本全面介绍Netty在即时通讯领域应用的教程,适合对网络编程、Java后端开发和即时通讯感兴趣的开发者阅读。通过学习本书,读者不仅可以掌握Netty的使用,还...
赠送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 即时通讯系统,掘金小册子,netty教程。章节齐全无缺失,排版非常不错。 1.仿微信IM系统简介 1 2.Netty是什么? 2 3.服务端启动流程 8 4.客户端启动流程 11 5.实战:客户端与服务端双向...
赠送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....
1. **非阻塞I/O**:Netty基于Java NIO(Non-blocking I/O)实现,允许在一个线程中处理多个连接,提高了系统的资源利用率和并发能力。 2. **零拷贝**:通过使用Direct Buffer和FileChannel.transferTo方法,Netty...
赠送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》中的案例涵盖了Netty的启动和停止、内存、并发多线程、性能、可靠性、安全等方面,囊括了Netty绝大多数常用的功能及容易让人犯错的地方。在案例的分析过程中,还穿插讲解了Netty...
赠送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; 包含...
赠送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-...
赠送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...
赠送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队列实现即时通信1、简介使用disruptor改造netty通讯,使提高吞吐率,主要是提供disruptor如何与netty整合的思路2、软件架构spring-boot2.7.3 + netty4.1.36.Final + disruptor + jdk1.83、源码...