Netty入门之 TimeServer && TimeClient

来源:互联网 发布:ubuntu 12.04 输入法 编辑:程序博客网 时间:2024/06/05 18:16

1.TimeServer

/** * Created by ju on 2017-06-09. */public class TimeServer {    public void bind(int port) {        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();            //等待服务器端链路关闭之后main函数退出            f.channel().closeFuture().sync();        } catch (Exception e) {            e.printStackTrace();        }finally {            bossGroup.shutdownGracefully();            workerGroup.shutdownGracefully();        }    }    private class ChildChannelHandler extends ChannelInitializer<SocketChannel> {        protected void initChannel(SocketChannel socketChannel) throws Exception {            socketChannel.pipeline().addLast(new TimeServerHandler());        }    }    public static void main(String[] args) {        int port = 8080;        if(args!=null && args.length > 0){            port = Integer.valueOf(args[0]);        }        new TimeServer().bind(port);    }}

2.TimeServerHandler

/** * Created by ju on 2017-06-09. */public class TimeServerHandler extends ChannelInboundHandlerAdapter {    @Override    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 Date(System.currentTimeMillis()).toString() : "BAD ORDER";        ByteBuf resp = Unpooled.copiedBuffer(currentTime.getBytes());        ctx.write(resp);    }    @Override    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {        ctx.flush();    }    @Override    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {        ctx.close();    }}

3.TimeClient

/** * Created by ju on 2017-06-09. */public class TimeClient {    public void connect(int port, String host) {        EventLoopGroup group = new NioEventLoopGroup();        Bootstrap b = new Bootstrap();        b.group(group).channel(NioSocketChannel.class).option(ChannelOption.TCP_NODELAY, true)                .handler(new ChannelInitializer<SocketChannel>() {                    @Override                    protected void initChannel(SocketChannel socketChannel) throws Exception {                        socketChannel.pipeline().addLast(new TimeClientHandler());                    }                });        try {            ChannelFuture f = b.connect(host, port).sync();            //等待客户端链路关闭            f.channel().closeFuture().sync();        } catch (InterruptedException e) {            e.printStackTrace();        }    }    public static void main(String[] args) {        int port = 8080;        if(args !=null && args.length > 0 ){            port = Integer.valueOf(args[0]);        }        new TimeClient().connect(port,"127.0.0.1");    }}

4.TimeClientHandler

/** * Created by ju on 2017-06-09. */public class TimeClientHandler extends ChannelInboundHandlerAdapter{    private static final Logger logger = Logger.getLogger(TimeClientHandler.class.getName());    private final ByteBuf firstMessage;    public TimeClientHandler(ByteBuf firstMessage) {        this.firstMessage = firstMessage;    }    public TimeClientHandler() {        byte [] req = "QUERY TIME ORDER".getBytes();        firstMessage = Unpooled.buffer(req.length);        firstMessage.writeBytes(req);    }     @Override    public void channelActive(ChannelHandlerContext ctx) throws Exception {        ctx.writeAndFlush(firstMessage);    }    @Override    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {        ByteBuf byteBuf = (ByteBuf) msg;        byte [] req = new byte[byteBuf.readableBytes()];        byteBuf.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 {        logger.warning("Unexpected expection from downstream"+cause.getMessage());        ctx.close();    }}

这些代码来源于《Netty权威指南》 上的Netty入门代码,对Netty底层细节还不了解,只是接触Netty开发框架。

原创粉丝点击