Netty学習ノート4:EchoサービスとNettyプロジェクトの構築
25580 ワード
Netty学習ノート4:EchoサービスとNettyプロジェクトの構築
文書ディレクトリ Netty学習ノート4:EchoサービスとNettyプロジェクトの構築 Echoサービス とは Echoサービス側プログラム作成 Echoクライアント作成 Echoサービスにおける名詞解析 Echoサービスとは Echoサービスは、クライアントがどのようなデータを送信するか、サービス側が対応するデータに応答する応答サービスであり、デバッグおよび検出に非常に有用なサービスである.
Echoサービス側プログラム作成 EchoServerサービス 一、ポートのバインド
二、主従スレッドグループの作成
三、スレッドグループを起動し、チャネルタイプを指定し、伝達されたデータ内容を処理する.
四、傍受ポート、ポートを閉じる
五、スレッドを解放する.処理クラス
Echoクライアント作成 EchoClientプライマリクラス EchoClientHandler処理クラス 一、サービス側の処理類の継承とは異なるが、実質は同じである.
二、印刷順序は、先にアクティブ化し、表示し、サービス側にチャネルを確立する方法である.
三、サービス側のデータを読み取る.
四、読み取り完了.チャンネルReadComplete()メソッドに入ります.
Echoサービスにおける名詞解析 EventLoopとEventLoopGroup スレッドとスレッドグループは、前者はスレッドと理解でき、後者はスレッドグループと理解できる. BootStrap
ブートクラスを起動し、スレッドグループを構成し、起動時にスレッドグループを同時に起動し、チャネルを開き、チャネルを初期化します.いくつかの処理を行います. channel
channelはクライアントとサービス側が確立した接続であり、Socket接続であり、ライフサイクルがあり、確立に成功し、データを読み取り、読み取りが完了し、異常が発生するなどである. channelHandlerとchannelPipeline channelhandlerは,受信したデータを直接または間接的にchannelHandlerを継承するように処理する.
channelPipelineは処理工場のようなもので、handler処理クラスを多く追加することができ、channelHandlerに入るとpipelineに追加されたhandlerで処理します.個人理解: 濾水システムのように、BootStrapは濾水システムのスイッチで、それは濾水システムと水資源を接続して、それから1つの通路Channelを生成して、各通路の中に1つの浄水処理システムがあって、すなわち:ChannelHandler、各浄水システムの中に多くの処理パイプがあって、すなわち:Handler、処理パイプは生きていて、追加して、取り外すことができます.これらの動作はpipelineというツールクラスで実現されます.
文書ディレクトリ
Echoサービス側プログラム作成
二、主従スレッドグループの作成
三、スレッドグループを起動し、チャネルタイプを指定し、伝達されたデータ内容を処理する.
四、傍受ポート、ポートを閉じる
五、スレッドを解放する.
public class EchoServer {
private int port;
public EchoServer(int port){
this.port=port;
}
public void run() throws InterruptedException {
// 。
EventLoopGroup bossGroup=new NioEventLoopGroup();
EventLoopGroup workGroup=new NioEventLoopGroup();
try{
// ,Netty 。
ServerBootstrap serverBootstrap=new ServerBootstrap();
// 。// , Channel 。
serverBootstrap.group(bossGroup,workGroup)
.channel(NioServerSocketChannel.class)// 。
.childHandler(new ChannelInitializer<SocketChannel>() {// 。
protected void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(new EchoServerHandler());
}
});
System.out.println("Echo ing");
// , 。
ChannelFuture channelFuture = serverBootstrap.bind(port).sync();
// ,
channelFuture.channel().closeFuture().sync();
}finally {
// , 。
workGroup.shutdownGracefully();
bossGroup.shutdownGracefully();
}
}
public static void main(String[] args) throws InterruptedException {
int port =7070;
if(args.length>0){
port=Integer.parseInt(args[0]);
}
new EchoServer(port).run();
}
}
public class EchoServerHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
//ByteBuf Netty ByteBuffer。
ByteBuf data= (ByteBuf)msg;
System.out.println(" :"+data.toString(CharsetUtil.UTF_8));
// , 。
ctx.writeAndFlush(data);
}
@Override
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
System.out.println("EchoServerHandle channelReadComplete");
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
cause.printStackTrace();
ctx.close();
}
}
Echoクライアント作成
public class EchoClient {
private int port;
private String host;
public EchoClient(String host,int port){
this.port=port;
this.host=host;
}
public void start() throws InterruptedException {
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 ch) throws Exception {
ch.pipeline().addLast(new EchoClientHandler());
}
});
// ,connect , sync, 。
ChannelFuture channelFulture = bootstrap.connect().sync();
// , 。
channelFulture.channel().closeFuture().sync();
}finally {
// NIO 。
group.shutdownGracefully();
}
}
public static void main(String[] args) throws InterruptedException {
new EchoClient("127.0.0.1",7070).start();
}
}
二、印刷順序は、先にアクティブ化し、表示し、サービス側にチャネルを確立する方法である.
三、サービス側のデータを読み取る.
四、読み取り完了.チャンネルReadComplete()メソッドに入ります.
public class EchoClientHandler extends SimpleChannelInboundHandler<ByteBuf> {
protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception {
System.out.println("Client received...."+msg.toString(CharsetUtil.UTF_8));
}
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
System.out.println("Active");
// 。 Unpooled 。
ctx.writeAndFlush(Unpooled.copiedBuffer(" , zkf",CharsetUtil.UTF_8));
}
@Override
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
System.out.println("EchoClient channelReadComplete");
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
cause.printStackTrace();
ctx.close();
}
}
Echoサービスにおける名詞解析
ブートクラスを起動し、スレッドグループを構成し、起動時にスレッドグループを同時に起動し、チャネルを開き、チャネルを初期化します.いくつかの処理を行います.
channelはクライアントとサービス側が確立した接続であり、Socket接続であり、ライフサイクルがあり、確立に成功し、データを読み取り、読み取りが完了し、異常が発生するなどである.
channelPipelineは処理工場のようなもので、handler処理クラスを多く追加することができ、channelHandlerに入るとpipelineに追加されたhandlerで処理します.