NettyベースのRPCアーキテクチャの実戦演習(二)-netty 3サービス側とクライアント

7415 ワード

一、Netty
(1)NettyはJBOSSが提供するjavaオープンソースフレームワークである.Nettyは、高性能で信頼性の高いネットワークサーバとクライアントプログラムを迅速に開発するために、非同期でイベント駆動のネットワークアプリケーションフレームワークとツールを提供する.
つまり、NettyはNIOベースのお客様、サーバ側のプログラミングフレームワークであり、Nettyを使用すると、あるプロトコルを実現したお客様、サービス側のアプリケーションなど、ネットワークアプリケーションを迅速かつ簡単に開発することができます.Nettyは、TCPおよびUDPベースのsocketサービス開発など、ネットワークアプリケーションを簡略化およびストリーミングしたプログラミング開発プロセスに相当する.
「高速」と「シンプル」では、保守性やパフォーマンスの問題は発生しません.Nettyは、FTP、SMTP、HTTPなどの様々なバイナリテキストプロトコルを含む多様なプロトコルの実装経験を吸収し、かなり丹念に設計されたプロジェクトである.最終的に、Nettyは開発が容易であることを保証するとともに、その応用性、安定性、伸縮性を保証する方法を見つけることに成功した.
 
(2)Nettyバージョンは概ねnetty 3.xとnetty 4.x、netty 5.xに分かれている
 
(3)Netty応用分野:
1分散プロセス通信
例えば、hadoop、dubbo、akkaなどの分散機能を有するフレームワーク、下位RPC通信はnettyに基づいて実現され、これらのフレームワークで使用されるバージョンは通常netty 3を使用する.x
2、ゲームサーバーの開発
最新のゲームサーバでは、一部の会社がnetty 4を採用し始めた可能性がある.xまたはnetty 5.x
 
二、nettyサービス側hello worldケース
package com.server;

import java.net.InetSocketAddress;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.jboss.netty.bootstrap.ServerBootstrap;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.channel.Channels;
import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
import org.jboss.netty.handler.codec.string.StringDecoder;
import org.jboss.netty.handler.codec.string.StringEncoder;
/**
 * netty     
 *
 */
public class Server {

	public static void main(String[] args) {

		//   
		ServerBootstrap bootstrap = new ServerBootstrap();
		
		//boss      ,worker        
		ExecutorService boss = Executors.newCachedThreadPool();
		ExecutorService worker = Executors.newCachedThreadPool();
		
		//  niosocket  
		bootstrap.setFactory(new NioServerSocketChannelFactory(boss, worker));
		
		//       
		bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
			
			@Override
			public ChannelPipeline getPipeline() throws Exception {

				ChannelPipeline pipeline = Channels.pipeline();
				pipeline.addLast("decoder", new StringDecoder());
				pipeline.addLast("encoder", new StringEncoder());
				pipeline.addLast("helloHandler", new HelloHandler());
				return pipeline;
			}
		});
		
		bootstrap.bind(new InetSocketAddress(10101));
		
		System.out.println("start!!!");
		
	}

}
package com.server;

import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ChannelStateEvent;
import org.jboss.netty.channel.ExceptionEvent;
import org.jboss.netty.channel.MessageEvent;
import org.jboss.netty.channel.SimpleChannelHandler;
/**
 *        
 *
 */
public class HelloHandler extends SimpleChannelHandler {

	/**
	 *     
	 */
	@Override
	public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {

		
		String s = (String) e.getMessage();
		System.out.println(s);
		
		//    
		ctx.getChannel().write("hi");
		super.messageReceived(ctx, e);
	}

	/**
	 *     
	 */
	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {
		System.out.println("exceptionCaught");
		super.exceptionCaught(ctx, e);
	}

	/**
	 *    ,      IP      
	 */
	@Override
	public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
		System.out.println("channelConnected");
		super.channelConnected(ctx, e);
	}

	/**
	 *          ,           
	 */
	@Override
	public void channelDisconnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
		System.out.println("channelDisconnected");
		super.channelDisconnected(ctx, e);
	}

	/**
	 * channel       ,                    
	 */
	@Override
	public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
		System.out.println("channelClosed");
		super.channelClosed(ctx, e);
	}
}

三、nettyクライアントhello worldケース
package com.client;

import java.net.InetSocketAddress;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.jboss.netty.bootstrap.ClientBootstrap;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelFuture;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.channel.Channels;
import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory;
import org.jboss.netty.handler.codec.string.StringDecoder;
import org.jboss.netty.handler.codec.string.StringEncoder;
/**
 * netty     
 *
 */
public class Client {

	public static void main(String[] args) {
		
		//   
		ClientBootstrap bootstrap = new  ClientBootstrap();
		
		//   
		ExecutorService boss = Executors.newCachedThreadPool();
		ExecutorService worker = Executors.newCachedThreadPool();
		
		//socket  
		bootstrap.setFactory(new NioClientSocketChannelFactory(boss, worker));
		
		//    
		bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
			
			@Override
			public ChannelPipeline getPipeline() throws Exception {
				ChannelPipeline pipeline = Channels.pipeline();
				pipeline.addLast("decoder", new StringDecoder());
				pipeline.addLast("encoder", new StringEncoder());
				pipeline.addLast("hiHandler", new HiHandler());
				return pipeline;
			}
		});
		
		//     
		ChannelFuture connect = bootstrap.connect(new InetSocketAddress("127.0.0.1", 10101));
		Channel channel = connect.getChannel();
		
		System.out.println("client start");
		
		Scanner scanner = new Scanner(System.in);
		while(true){
			System.out.println("   ");
			channel.write(scanner.next());
		}
	}

}
package com.client;

import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ChannelStateEvent;
import org.jboss.netty.channel.ExceptionEvent;
import org.jboss.netty.channel.MessageEvent;
import org.jboss.netty.channel.SimpleChannelHandler;
/**
 *        
 *
 */
public class HiHandler extends SimpleChannelHandler {

	/**
	 *     
	 */
	@Override
	public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {

		
		String s = (String) e.getMessage();
		System.out.println(s);
		
		super.messageReceived(ctx, e);
	}

	/**
	 *     
	 */
	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {
		System.out.println("exceptionCaught");
		super.exceptionCaught(ctx, e);
	}

	/**
	 *    
	 */
	@Override
	public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
		System.out.println("channelConnected");
		super.channelConnected(ctx, e);
	}

	/**
	 *          ,           
	 */
	@Override
	public void channelDisconnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
		System.out.println("channelDisconnected");
		super.channelDisconnected(ctx, e);
	}

	/**
	 * channel       
	 */
	@Override
	public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
		System.out.println("channelClosed");
		super.channelClosed(ctx, e);
	}
}

コメント:
channelDisconnectedとchannelClosedの違いは?
channelDisconnectedは、接続が確立された後に切断された場合にのみ呼び出されます.
channelClosed接続が成功するかどうかにかかわらず、リソースのクローズを呼び出す