Java Netty 学习笔记(二)使用Netty编程
来源:互联网 发布:软件安全测试招聘 编辑:程序博客网 时间:2024/06/05 09:34
熟悉了使用java nio编程的套路,实际上就跟底层socket的没啥区别。
下面学习如何使用Netty编写简单的Time Server。
代码:https://github.com/NearXdu/NettyLearn
public class TimeServer { public void bind(int port) throws Exception{ //配置服务端的NIO线程组 // EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try{ ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup,workerGroup) .channel(NioServerSocketChannel.class) .option(ChannelOption.SO_BACKLOG,1024) .childHandler(new ChildChannelHandler()); //绑定端口,同步等待成功 ChannelFuture f = b.bind(port).sync(); //等待服务端监听端口关闭 f.channel().closeFuture().sync(); }finally { //释放线程池资源 bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } } private class ChildChannelHandler extends ChannelInitializer<SocketChannel> { @Override protected void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new TimeServerHandler()); } } public static void main(String[] args) throws Exception{ int port =1025; if(args!=null && args.length>0){ try{ port =Integer.valueOf(args[0]); }catch (NumberFormatException e){ } } new TimeServer().bind(port); }}
1.NioEventLoopGroup
:Reactor线程组,用于处理网络事件。
2.ServerBootstrap
:Netty用于启动NIO服务端的辅助启动类。
3.ServerBootstrap
的group
方法设置监听套接字NioServerSocketChannel
设置BACKLOG,设置IO事件的处理类ChildChannelHandler
4.ServerBootstrap
的bind
方法绑定监听端口
在Handler类中,有些区别就是netty4和netty5的API会有些出入,在书中继承ChannelHandlerAdapter,我用的是Netty4,因此需要稍微改写:
public class TimeServerHandler extends ChannelInboundHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { ByteBuf buf = (ByteBuf) msg;//read buff byte[] req = new byte[buf.readableBytes()];//通过readble获取到大小 buf.readBytes(req);//readByte将数据塞入req中 //业务 String body = new String(req, "UTF-8"); System.out.println("The time server receive order : " + body); String currentTime = "QUERY TIME ORDER".equalsIgnoreCase(body.trim()) ? new java.util.Date( System.currentTimeMillis()).toString() : "BAD ORDER"; //构造响应 ByteBuf resp = Unpooled.copiedBuffer(currentTime.getBytes()); //发送 ctx.write(resp); }}
这个方法就有点类似muduo中onMessage,或者libevent中onRead回调了,数据通过参数传递,并使用封装的缓存接收,最后构造业务响应。
参考:
1) netty权威指南
2) http://stackoverflow.com/questions/24844042/extends-channelhandleradapter-but-does-not-override-or-implement-a-method-from
阅读全文
1 0
- Java Netty 学习笔记(二)使用Netty编程
- Netty 学习笔记二 ByteToMessageDecoder使用
- Netty学习之二--Java socket编程(UDP实例)
- Java Netty 学习笔记(一)初识Netty
- Netty学习(二)-Helloworld Netty
- 学习 java netty (二) -- ServerBootstrap
- Netty学习-Java网络编程
- Netty学习 netty nio编程
- 【Netty】netty学习笔记一
- Netty 学习笔记之二 Netty 核心概念
- JAVA Socket编程学习8--为什么使用Netty
- Netty 权威指南笔记(二):Java NIO 和 Netty 对比
- 5、netty-java序列化(netty学习笔记)
- netty学习(二)--传统的bio编程
- Netty学习笔记(一)
- netty学习笔记(一)
- Netty学习笔记(一)
- Android开发之使用Netty进行Socket编程(二)
- avcodec_register()
- 计蒜客 等和的分隔子集 (dp)
- ffmpeg重采样resample包含AVAudioFifo(三)
- linux实战:ps和top命令系统调优
- 量化交易 获取获取上市公司年报
- Java Netty 学习笔记(二)使用Netty编程
- 如何看待 Kotlin 成为 Android 官方支持开发语言?
- 如何在react vr中使用中文
- eclipse中某工程的断点进不去问题,折腾了N个小时才找到原因,郁闷
- Gradle与Android Gradle插件的版本对应关系
- navicat连接阿里云服务器报1130错误的解决方法
- Android databinding(四)--layout中的特殊使用
- POI实现Excel批量导入数据(SpringMVC)
- makefile eval函数详解