Netty学習ノート(実験編)2
3313 ワード
今回の実験ではnettyでEchoServerを実現し,Echo Protocolの定義はここにあるhttp://tools.ietf.org/html/rfc862
1.サーバー側傍受ポート7(Linuxでは一般ユーザーが1024以下のポートを使用できないため、バインド7777)
2.クライアントがサーバに接続してデータを送信する
3.サーバは受信したデータを直接クライアントに返す
コードは次のとおりです.
次にncでEchoServerをテストします
印刷されたログから、サーバ側がHello Kugouを受信し、クライアントに直接書き返したことがわかります.
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をテストします
印刷されたログから、サーバ側がHello Kugouを受信し、クライアントに直接書き返したことがわかります.