博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用netty的NIO来实现一个简单的TimeServer
阅读量:6080 次
发布时间:2019-06-20

本文共 4922 字,大约阅读时间需要 16 分钟。

只想以此来加深java的NIO这方面的知识点~~~

参考书籍《netty权威指南》(第二版)

这本书,第一二三章,前面讲java的bio,nio,nio2,

讲得蛮好的。

1fe05f028311d62f8bc3ccc31ab4ad94f3101275

package com.phei.netty;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) throws Exception {		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
{ protected void initChannel(SocketChannel arg0) throws Exception { arg0.pipeline().addLast(new TimeServerHandler()); } } public static void main(String[] args) throws Exception { int port = 8080; if (args != null && args.length > 0) { try { port = Integer.valueOf(args[0]); } catch (NumberFormatException e) { e.printStackTrace(); } } System.out.println("The time server is start in port: " + port); new TimeServer().bind(port); System.out.println("The time server is start in port: " + port); }}
package com.phei.netty;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 {		public void channelRead(ChannelHandlerContext ctx, Object msg) 		throws Exception {		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 currentTime = "QUERY TIME ORDER".equalsIgnoreCase(body) ? 				new java.util.Date(System.currentTimeMillis()).toString() : "BAD ORDER";				ByteBuf resp = Unpooled.copiedBuffer(currentTime.getBytes());				ctx.write(resp);	}		public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {		ctx.flush();	}		@Override	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {		ctx.close();	}}
package com.phei.netty;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(int port, String host) throws Exception {		EventLoopGroup group = new NioEventLoopGroup();		try {			Bootstrap b = new Bootstrap();			b.group(group).channel(NioSocketChannel.class)			.option(ChannelOption.TCP_NODELAY, true)			.handler(new ChannelInitializer
() { @Override public void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new TimeClientHandler()); } }); ChannelFuture f = b.connect(host, port).sync(); f.channel().closeFuture().sync(); } finally { group.shutdownGracefully(); } } public static void main(String[] args) throws Exception { // TODO Auto-generated method stub int port = 8080; if (args != null && args.length > 0) { try { port = Integer.valueOf(args[0]); } catch (NumberFormatException e) { e.printStackTrace(); } } new TimeClient().connect(port, "localhost"); }}
package com.phei.netty;import java.util.logging.Logger;import io.netty.buffer.ByteBuf;import io.netty.buffer.Unpooled;import io.netty.channel.ChannelHandlerAdapter;import io.netty.channel.ChannelHandlerContext;public class TimeClientHandler  extends ChannelHandlerAdapter {	private static final Logger logger = Logger			.getLogger(TimeClientHandler.class.getName());	private final ByteBuf firstMessage;		public TimeClientHandler() {		byte[] req = "QUERY TIME ORDER".getBytes();		firstMessage = Unpooled.buffer(req.length);		firstMessage.writeBytes(req);	}		public void channelActive(ChannelHandlerContext ctx) {		ctx.writeAndFlush(firstMessage);	}		public void channelRead(ChannelHandlerContext ctd, Object msg) throws Exception {		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);	}		public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {		logger.warning("Unexpected exception from downstream: " + cause.getMessage());		ctx.close();	}}

转载地址:http://sxegx.baihongyu.com/

你可能感兴趣的文章
tomcat指定配置文件路径方法
查看>>
linux下查看各硬件型号
查看>>
epoll的lt和et模式的实验
查看>>
Flux OOM实例
查看>>
07-k8s-dns
查看>>
Android 中 ListView 分页加载数据
查看>>
oracle启动报错:ORA-00845: MEMORY_TARGET not supported on this system
查看>>
Go方法
查看>>
Dapper丶DapperExtention,以及AbpDapper之间的关系,
查看>>
搞IT的同学们,你们在哪个等级__那些年发过的帖子
查看>>
且谈语音搜索
查看>>
MySQL数据库导入导出常用命令
查看>>
低版本Samba无法挂载
查看>>
Telegraf+Influxdb+Grafana构建监控平台
查看>>
使用excel 展现数据库内容
查看>>
C#方法拓展
查看>>
MySql.Data.dll的版本
查看>>
Linux系统磁盘管理
查看>>
hdu 2191 (多重背包+二进制优化)
查看>>
home.php
查看>>