Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。
也就是说,Netty 是一个基于NIO的客户、服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户、服务端应用。Netty相当于简化和流线化了网络应用的编程开发过程,例如:基于TCP和UDP的socket服务开发。
“快速”和“简单”并不用产生维护性或性能上的问题。Netty 是一个吸收了多种协议(包括FTP、SMTP、HTTP等各种二进制文本协议)的实现经验,并经过相当精心设计的项目。最终,Netty 成功的找到了一种方式,在保证易于开发的同时还保证了其应用的性能,稳定性和伸缩性【来自百度】
编写服务器端模板
启动类
public class Myserver {
public static void main(String[] args)throws Exception{
EventLoopGroup boss = new NioEventLoopGroup();
EventLoopGroup woke = new NioEventLoopGroup();//一般使用两个工作组,woke为最终执行的组
try {
ServerBootstrap serverBootstrap = new ServerBootstrap();/./获取服务器驱动
serverBootstrap.group(boss, woke).channel(NioServerSocketChannel.class).handler(new LoggingHandler(LogLevel.INFO)).childHandler(new MyInitializer());//前handler为boss的,后handler为woke的
ChannelFuture localhost = serverBootstrap.bind("localhost", 8089).sync();.//绑定8089端口
localhost.channel().closeFuture().sync();
} finally {
boss.shutdownGracefully();
}
}
}
编写MyInitializer
public class MyInitializer extends ChannelInitializer<SocketChannel> {
protected void initChannel(SocketChannel socketChannel) throws Exception {
ChannelPipeline pipeline = socketChannel.pipeline();//获取管道
pipeline.addLast(new IdleStateHandler(3, 4,4, TimeUnit.SECONDS));//拦截处理器一(顺序为读,写,读写空闲时间)
pipeline.addLast(new MyHandler());//自定义拦截处理器
}
}
编写MyHandeler
public class MyHandler extends ChannelInboundHandlerAdapter {
@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
if (evt instanceof IdleStateEvent){
IdleStateEvent id = (IdleStateEvent)evt;
String stateType = null;
switch(id.state()){
case READER_IDLE:
stateType="读空闲";
break;
case WRITER_IDLE:
stateType="写空闲";
break;
case ALL_IDLE:
stateType="读写空闲";
break;
}
System.out.println(stateType);
ctx.channel().closeFuture();
}
}
}
整个程序相当于简化的心跳检测,客户端代码省略因为基本相同。IdleStateHandler(3, 4,4, TimeUnit.SECONDS)这个netty提供的处理器就检测客户端的读写空闲,超过设置时间则会触发IdleStateEvent并将其传到下一个处理器,userEventTriggered方法则检测到该事件的发生做出相应的处理。