Netty実装Server Socket
3826 ワード
Netty実装Server Socket
Nettyは、NIO(Nonblocking I/O、非ブロックIO)に基づいて開発されたネットワーク通信フレームワークであり、BIO(Blocking I/O、ブロックIO)に比べて、彼の同時性能が大幅に向上した.NIO、同期非ブロックIO、トラフィック処理をブロックするがデータ受信をブロックしない、高同時かつ簡単なシーンを処理するのに適している.
関連概念:
Channel
データ転送ストリームは、channelに関する概念が以下の4つあり、前の図ではnettyの中のChannelを理解しています.チャネルは、接続を表し、各要求がチャネルであることを理解することができる. ChannelHandler、コア処理トラフィックはここで、トラフィック要求を処理するために使用される. ChannelHandlerContextは、トラフィックデータを転送するために使用される. ChannelPipelineは、処理に必要なChannelHandlerおよびChannelHandlerContextを保存するために使用される.
ByteBuf
ByteBufはバイトを格納するコンテナで、バイト全体のキャッシュを読み書きしやすく、get/setもサポートしています. Heap Bufferスタックバッファ、スタックバッファはByteBufで最もよく使われるモードで、彼はデータをスタック空間に格納します. DirectBuffer直接バッファ、彼のメモリ割り当てはスタックで発生しませんjdk 1.4導入されたnioのByteBufferクラスは、jvmがローカルメソッドを介して割り当てメモリ を呼び出すことを可能にする. Composite Buffer複合バッファは、nettyが提供する複数の異なるByteBufのビューに相当し、jdkはこのような機能を提供しない.
Codec
Nettyのエンコーディング/デコーダ、HttpRequestDecoderおよびHttpResponseEncoder、カスタムデコーダ
サーバソケットをnettyで実装するには、次の手順に従います.
1.環境:ideal springboot
pom.xmlに依存を追加するには:
2.Serverエンドコード:
Handerコード:
主にいくつかのインタフェース関数を実現します
Nettyは、NIO(Nonblocking I/O、非ブロックIO)に基づいて開発されたネットワーク通信フレームワークであり、BIO(Blocking I/O、ブロックIO)に比べて、彼の同時性能が大幅に向上した.NIO、同期非ブロックIO、トラフィック処理をブロックするがデータ受信をブロックしない、高同時かつ簡単なシーンを処理するのに適している.
関連概念:
Channel
データ転送ストリームは、channelに関する概念が以下の4つあり、前の図ではnettyの中のChannelを理解しています.
ByteBuf
ByteBufはバイトを格納するコンテナで、バイト全体のキャッシュを読み書きしやすく、get/setもサポートしています.
Codec
Nettyのエンコーディング/デコーダ、HttpRequestDecoderおよびHttpResponseEncoder、カスタムデコーダ
サーバソケットをnettyで実装するには、次の手順に従います.
1.環境:ideal springboot
pom.xmlに依存を追加するには:
io.netty
netty-all
5.0.0.Alpha2
2.Serverエンドコード:
public class EchoServer {
private final Integer tcpServerPort;
public EchoServer(Integer tcpServerPort) {
this.tcpServerPort = tcpServerPort;
}
public void start() throws InterruptedException {
EventLoopGroup group = new NioEventLoopGroup();
try {
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(group)
.channel(NioServerSocketChannel.class)
.option(ChannelOption.SO_KEEPALIVE, true)
.localAddress(new InetSocketAddress(tcpServerPort))
.childHandler(new ChannelInitializer() {
@Override
protected void initChannel(SocketChannel socketChannel) throws
Exception {
socketChannel.pipeline().addLast(
//
new ReadTimeoutHandler(30),
//
new WriteTimeoutHandler(30),
// Handler
new EchoServerHandler()
);
}
});
ChannelFuture future = bootstrap.bind().sync();
future.channel().closeFuture().sync();
} finally {
group.shutdownGracefully().sync();
}
}
public static void main(String[] args) {
EchoServer tcpserver = new EchoServer(6788);
try {
tcpserver.start();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Handerコード:
主にいくつかのインタフェース関数を実現します
// Handler Handler 。
@ChannelHandler.Sharable
public class EchoServerHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelActive(final ChannelHandlerContext ctx)throws Exception{
// ,
}
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
ByteBuf in = (ByteBuf) msg;
System.out.println("Server received:" + in.toString(CharsetUtil.UTF_8));
//
ctx.writeAndFlush(msg);
}
@Override
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws
Exception {
cause.printStackTrace();
ctx.close();
}
}