您的位置:首页 > 其它

netty入门实例

2015-04-03 15:31 549 查看
TimeServer.java

package netty.timeserver.server;

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 {

            // 配置服务器的NIO线程租

            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 arg0) throws Exception {

            System.out.println("server initChannel..");

            arg0.pipeline().addLast(new TimeServerHandler());

        }

    }

    public static void main(String[] args) throws Exception {

        int port = 9000;

        if (args != null && args.length > 0) {

            try {

                port = Integer.valueOf(args[0]);

            } catch (NumberFormatException e) {

            }

        }

        new TimeServer().bind(port);

    }

}

TimeServerHandler.java

package netty.timeserver.server;

import java.util.Date;

import io.netty.buffer.ByteBuf;

import io.netty.buffer.Unpooled;

import io.netty.channel.ChannelHandlerContext;

import io.netty.channel.ChannelInboundHandlerAdapter;

public class TimeServerHandler extends ChannelInboundHandlerAdapter {

    @Override

    public void channelRead(ChannelHandlerContext ctx, Object msg)

            throws Exception {

        System.out.println("server channelRead..");

        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 {

        System.out.println("server channelReadComplete..");

        ctx.flush();//刷新后才将数据发出到SocketChannel

    }

    @Override

    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)

            throws Exception {

        System.out.println("server exceptionCaught..");

        ctx.close();

    }

}

TimeClient.java

package netty.timeserver.client;

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 {

        // 配置客户端NIO线程组

        EventLoopGroup group = new NioEventLoopGroup();

        try {

            Bootstrap b = new Bootstrap();

            b.group(group).channel(NioSocketChannel.class)

                    .option(ChannelOption.TCP_NODELAY, true)

                    .handler(new ChannelInitializer<SocketChannel>() {

                        @Override

                        protected void initChannel(SocketChannel arg0)

                                throws Exception {

                            System.out.println("client initChannel..");

                            arg0.pipeline().addLast(new TimeClientHandler());

                        }

                    });

            // 发起异步连接操作

            ChannelFuture f = b.connect(host, port).sync();

            // 等待客户端链路关闭

            f.channel().closeFuture().sync();

        } finally {

            // 优雅退出,释放NIO线程组

            group.shutdownGracefully();

        }

    }

    public static void main(String[] args) throws Exception {

        int port = 9000;

        if (args != null && args.length > 0) {

            try {

                port = Integer.parseInt(args[0]);

            } catch (Exception e) {

            }

        }

        new TimeClient().connect(port, "127.0.0.1");

    }

}

TimeClientHandler.java

package netty.timeserver.client;

import java.util.logging.Logger;

import io.netty.buffer.ByteBuf;

import io.netty.buffer.Unpooled;

import io.netty.channel.ChannelHandlerContext;

import io.netty.channel.ChannelInboundHandlerAdapter;

public class TimeClientHandler extends ChannelInboundHandlerAdapter {

    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);

    }

    @Override

    public void channelActive(ChannelHandlerContext ctx) throws Exception {

        //与服务端建立连接后

        System.out.println("client channelActive..");

        ctx.writeAndFlush(firstMessage);

    }

    @Override

    public void channelRead(ChannelHandlerContext ctx, Object msg)

            throws Exception {

        System.out.println("client channelRead..");

        //服务端返回消息后

        ByteBuf buf = (ByteBuf) msg;

        byte[] req = new byte[buf.readableBytes()];

        buf.readBytes(req);

        String body = new String(req, "UTF-8");

        Syst
9411
em.out.println("Now is :" + body);

    }

    @Override

    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)

            throws Exception {

        System.out.println("client exceptionCaught..");

        // 释放资源

        logger.warning("Unexpected exception from downstream:"

                + cause.getMessage());

        ctx.close();

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Netty