Java Netty Echo 程序

使用 Netty 实现的 Echo 程序:客户端发送信息,服务端原样返回。


1.服务端

package com.learn.netty.echo;



import io.netty.bootstrap.ServerBootstrap;

import io.netty.channel.ChannelFuture;

import io.netty.channel.ChannelInitializer;

import io.netty.channel.EventLoopGroup;

import io.netty.channel.nio.NioEventLoopGroup;

import io.netty.channel.socket.SocketChannel;

import io.netty.channel.socket.nio.NioServerSocketChannel;



import java.net.InetSocketAddress;



public class EchoServer {

    private final int port;



    public EchoServer(int port) {

        this.port = port;

    }



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

        new EchoServer(8888).start();

    }



    public void start() throws Exception {

        final EchoServerHandler serverHandler = new EchoServerHandler();

        EventLoopGroup group = new NioEventLoopGroup();

        try {

            ServerBootstrap bootstrap = new ServerBootstrap();

            bootstrap.group(group)

                    .channel(NioServerSocketChannel.class)

                    .localAddress(new InetSocketAddress(port))

                    .childHandler(new ChannelInitializer<SocketChannel>() {

                        protected void initChannel(SocketChannel socketChannel) throws Exception {

                            socketChannel.pipeline().addLast(serverHandler);

                        }

                    });

            ChannelFuture future = bootstrap.bind().sync();

            future.channel().closeFuture().sync();

        } finally {

            group.shutdownGracefully().sync();

        }

    }

}


2.服务端Handler

package com.learn.netty.echo;



import io.netty.buffer.ByteBuf;

import io.netty.buffer.Unpooled;

import io.netty.channel.ChannelFutureListener;

import io.netty.channel.ChannelHandler;

import io.netty.channel.ChannelHandlerContext;

import io.netty.channel.ChannelInboundHandlerAdapter;



import java.nio.charset.Charset;



@ChannelHandler.Sharable

public class EchoServerHandler extends ChannelInboundHandlerAdapter {



    @Override

    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {

        ByteBuf in = (ByteBuf) msg;

        System.out.println("Server received: " + in.toString(Charset.defaultCharset()));

        ctx.write(in);

    }



    @Override

    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {

        ctx.writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);

    }



    @Override

    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {

        cause.printStackTrace();

        ctx.close();

    }

}


3.客户端

package com.learn.netty.echo;



import io.netty.bootstrap.Bootstrap;

import io.netty.channel.ChannelFuture;

import io.netty.channel.ChannelInitializer;

import io.netty.channel.EventLoopGroup;

import io.netty.channel.nio.NioEventLoopGroup;

import io.netty.channel.socket.SocketChannel;

import io.netty.channel.socket.nio.NioSocketChannel;



import java.net.InetSocketAddress;



public class EchoClient {

    private final String host;

    private final int port;



    public EchoClient(String host, int port) {

        this.host = host;

        this.port = port;

    }



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

        new EchoClient("127.0.0.1", 8888).start();

    }



    public void start() throws Exception {

        EventLoopGroup group = new NioEventLoopGroup();

        try {

            Bootstrap bootstrap = new Bootstrap();

            bootstrap.group(group)

                    .channel(NioSocketChannel.class)

                    .remoteAddress(new InetSocketAddress(host, port))

                    .handler(new ChannelInitializer<SocketChannel>() {

                        protected void initChannel(SocketChannel socketChannel) throws Exception {

                            socketChannel.pipeline().addLast(new EchoClientHandler());

                        }

                    });

            ChannelFuture future = bootstrap.connect().sync();

            future.channel().closeFuture().sync();

        } finally {

            group.shutdownGracefully().sync();

        }

    }

}


4.客户端Handler

package com.learn.netty.echo;



import io.netty.buffer.ByteBuf;

import io.netty.buffer.Unpooled;

import io.netty.channel.ChannelFuture;

import io.netty.channel.ChannelFutureListener;

import io.netty.channel.ChannelHandlerContext;

import io.netty.channel.SimpleChannelInboundHandler;

import io.netty.util.CharsetUtil;



public class EchoClientHandler extends SimpleChannelInboundHandler<ByteBuf> {



    @Override

    public void channelActive(ChannelHandlerContext ctx) throws Exception {

        ctx.writeAndFlush(Unpooled.copiedBuffer("Hello, Netty!", CharsetUtil.UTF_8))

                .addListener(new ChannelFutureListener() {

                    @Override

                    public void operationComplete(ChannelFuture channelFuture) throws Exception {

                        if (channelFuture.isSuccess()) {

                            System.out.println("Success!");

                        } else {

                            System.out.println("Fail!");

                            channelFuture.cause().printStackTrace();

                        }

                    }

                });

    }



    protected void channelRead0(ChannelHandlerContext channelHandlerContext, ByteBuf in) throws Exception {

        System.out.println("Client received: " + in.toString(CharsetUtil.UTF_8));

    }



    @Override

    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {

        cause.printStackTrace();

        ctx.close();

    }

}


  

展开阅读全文