Netty学習ノート(実験編)2


今回の実験ではnettyでEchoServerを実現し,Echo Protocolの定義はここにあるhttp://tools.ietf.org/html/rfc862
1.サーバー側傍受ポート7(Linuxでは一般ユーザーが1024以下のポートを使用できないため、バインド7777)
2.クライアントがサーバに接続してデータを送信する
3.サーバは受信したデータを直接クライアントに返す
コードは次のとおりです.
package netty.learn.echo;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;

import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * This is a EchoServer implements the ECHO protocol
 * User: mzy
 * Date: 13-6-16
 * Time:   3:13
 * Version:1.0.0
 */
class EchoHandler extends ChannelInboundHandlerAdapter{
    Logger log = Logger.getLogger(EchoHandler.class.getName());

    @Override
    public void messageReceived(ChannelHandlerContext ctx, MessageList<Object> msgs) throws Exception {
        ctx.write(msgs);
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        log.log(Level.WARNING,cause.getMessage());
        ctx.close();
    }
}
public class EchoServer {
    private int port;

    public EchoServer(int port) {
        this.port = port;
    }
    public void run(){
        NioEventLoopGroup boss = new NioEventLoopGroup();
        NioEventLoopGroup worker = new NioEventLoopGroup();
        ServerBootstrap b = new ServerBootstrap();
        b.group(boss,worker).channel(NioServerSocketChannel.class)
                .option(ChannelOption.SO_BACKLOG,100)
                .childHandler(new ChannelInitializer<SocketChannel>() {
                    @Override
                    protected void initChannel(SocketChannel socketChannel) throws Exception {
                        socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.INFO),new EchoHandler());
                    }
                });
        try {
            b.bind(port).sync().channel().closeFuture().sync();
        } catch (InterruptedException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        } finally {
            boss.shutdownGracefully();
            worker.shutdownGracefully();
        }

    }

    public static void main(String[] args) {
        new EchoServer(7777).run();
    }
}
はこのようにサーバー側が書いたので、実験1のDiscardServerと比較して、基本的にHandler以外に変化がないことを発見するのは難しくありません.このようにTimeServerのコードは実際にテンプレートとして使用することができます.
次にncでEchoServerをテストします
Netty学习笔记 (实验篇)二_第1张图片
印刷されたログから、サーバ側がHello Kugouを受信し、クライアントに直接書き返したことがわかります.