netty5.0(シングルとマルチ)クライアント

スティックパッケージ/開梱とは何ですか

フルサービスは、大きなパケット伝送にカプセル化されたより小さな複数のパケットが存在してもよい、送信TCPパケットを複数に分割してもよく、これは問題をアンパックTCPパケットです。
ここに画像を挿入説明

スティックパッケージ/発行し、一般的なアプローチを開梱、4つがあります。

以下充填メディアン空間よりも、固定長データセグメントを処理します。
メッセージヘッダ+メッセージ本体、メッセージ・ヘッダーは、一般的に、メッセージ本文、メッセージの種類および他の情報、実際のメッセージボディデータボリュームの長さを含みます。
特殊文字(例:キャリッジリターン)メッセージデータの最後として、サブメッセージ・データを達成するためです。
このように使用される複雑なアプリケーション層プロトコルは、結合ネットワークおよびアプリケーション層は比較的小さいです。そのようなよりように、需要カスタマイズプロトコルの開発を満たすことができるので、4つの方法の上記目的は、正確に、さらに解析処理のためのカスタムプロトコルのデータストリームを分離することで、第2の実施形態では、より多くの使用しました特定長いリンク網状保守ハートビート・メッセージは、クライアントの要求メッセージ、サービスに対応することができるメッセージのタイプ、:特定のデータパケットは、他の変数(例えば、必要な場合に網状プロトコルメッセージ、メッセージヘッダーを画定する本体内に配置することができますメッセージの処理結果の終了、等)。

ショート接続

接続- >データ伝送は- >近い接続
HTTPなどは、ステートレス短いリンク、それぞれのHTTP操作のために、あなたが接続を確立すると、ブラウザとサーバのですが、タスクが切断終了します。
接続が切断された後にデータが受信されるので、各処理時間を受信データには接触がないであろう。また、これはHTTPのステートレスなプロトコル理由の一つです。

ロング接続

接続- >送信データ- >接続されたまま- >送信データ- > ... - > 1つの接続が閉じられるまで、複数のクライアント接続が閉じられます。
長い接続を確立した後にかかわらず、接続が維持されているか否かのソケット接続を意味するが、安全性の低いです。

ロングとショートの接続で接続すると?

ロングの接続は、頻繁に操作のためのポイント通信にポイントを使用し、接続の数はあまりにも頻繁にすることはできません。各TCP接続は、3ウェイハンドシェイクを必要とする
処理速度がはるかに低くなる場合には、各操作がされますので、後に、それぞれの動作は、第1接続している場合、動作、時間がかかります
回を処理する際に、直接パケットを送信するために、開発を継続しますOK、TCP接続を確立していません。データベース接続に長い接続して、場合:たとえば、
短いとの接続頻繁に通信がソケットエラーが発生しますが、頻繁にソケット作成はリソースの無駄です。

サーバーへの長い接続が、それはいくつかのリソースを消費しますので、ウェブサイトのようなHTTPサービスは、WEBネットワークのように、一般的に短いリンクされている
ので、多くの場合、数千のクライアントまたは百万ものより短い接続で接続されます駅同時に、長い成功に接続している場合、一部の地方のリソースは、
ユーザーの何千も各ユーザーが1つの接続を占有している場合、それは想像することができます。だから、同時容量が、各ユーザーが頻繁に必要としない
短いより良いファンの動作を使用する必要の場合を。

シングルエンド顧客の例

クライアント:

public static void main(String[] args) throws InterruptedException {
	System.out.println("客户端已经启动....");
	// 创建负责接收客户端连接
	NioEventLoopGroup pGroup = new NioEventLoopGroup();
	Bootstrap b = new Bootstrap();
	b.group(pGroup).channel(NioSocketChannel.class).handler(new ChannelInitializer<SocketChannel>() {
		@Override
		protected void initChannel(SocketChannel sc) throws Exception {
			sc.pipeline().addLast(new StringDecoder());
			sc.pipeline().addLast(new ClientHandler());
		}
	});
	ChannelFuture cf = b.connect("127.0.0.1", 8080).sync();
	 cf.channel().writeAndFlush(Unpooled.wrappedBuffer("itmayiedu".getBytes()));
	 cf.channel().writeAndFlush(Unpooled.wrappedBuffer("itmayiedu".getBytes()));
	// 等待客户端端口号关闭
	cf.channel().closeFuture().sync();
	pGroup.shutdownGracefully();

}
public class ClientHandler extends ChannelHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
    System.out.println("客户端消息:"+msg.toString());
}

}
サーバー:

public static void main(String[] args) {
try {
			System.out.println("服务器端启动");
			NioEventLoopGroup pGroup=new NioEventLoopGroup();
			NioEventLoopGroup pGroup2=new NioEventLoopGroup();
			//创建铺助类
			ServerBootstrap serverBootstrap = new ServerBootstrap();
			serverBootstrap.group(pGroup, pGroup2).channel(NioServerSocketChannel.class).option(ChannelOption.SO_BACKLOG, 1024)
					.option(ChannelOption.SO_SNDBUF,32*1024).option(ChannelOption.SO_RCVBUF, 32*1024)
					.childHandler(new ChannelInitializer<io.netty.channel.socket.SocketChannel>() {
						@Override
						protected void initChannel(io.netty.channel.socket.SocketChannel soc) throws Exception {
							soc.pipeline().addLast(new StringDecoder());
							soc.pipeline().addLast(new ServerHandler());
						};
						
					});
			ChannelFuture sync = serverBootstrap.bind(8080).sync();
			sync.channel().closeFuture().sync();
			pGroup.shutdownGracefully();
			pGroup2.shutdownGracefully();
		}catch(Exception e) {
			e.printStackTrace();
		}
	}
public class ServerHandler extends ChannelHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
	super.channelRead(ctx, msg);
	System.out.println("服务端消息:"+msg.toString());
	//ctx.channel().writeAndFlush("serverHandler"+System.currentTimeMillis());
	//把消息往下一个Handler传
    ctx.fireChannelRead(msg);
}

}

マルチクライアント

サーバー:

      private  Bootstrap bootstrap=new Bootstrap();
	private final AtomicInteger index=new AtomicInteger();
	//对话对象组
	private List<Channel> channels=new ArrayList<Channel>();
	public void init(int count){
		 bootstrap.group(new NioEventLoopGroup());
		 bootstrap.channel(NioSocketChannel.class);
		bootstrap.handler(new ChannelInitializer<Channel>() {
			@Override
			protected void initChannel(Channel ch) throws Exception {
					ch.pipeline().addLast(new StringEncoder());
					ch.pipeline().addLast(new StringDecoder());
					ch.pipeline().addLast(new ServerHandlerMuch());
			}
		});
		for (int i = 0; i < count; i++) {
			Channel channel=bootstrap.connect(new InetSocketAddress("127.0.0.1",8080)).channel();
			channels.add(channel);
		}
	}
	 //获取可用的channel
	private Channel next(){
		return getChannel(0);
	}
	private Channel getChannel(int count) {
			Channel channel = channels.get(Math.abs(this.index.getAndIncrement()%channels.size()));
			if(count>=channels.size()) {
				throw new RuntimeException("没有足够的管道");
			}
			if(!channel.isActive()) {
				 //重连
				reconnect(channel);
				 //尝试获取下一个channel
				return getChannel(++count);
			}
		return channel;
	}
	private void reconnect(Channel channel) {

		synchronized (channel) {
			 int index=channels.indexOf(channel);
			 bootstrap.connect(new InetSocketAddress("127.0.0.1",8080)).channel();
			 channels.set(index, channel);
		}
	}
	
	public static void main(String[] args) {
		NetServerMuch netServerMuch=new NetServerMuch();
		netServerMuch.init(10);
		Scanner scanner = new Scanner(System.in);
	    while(true) {
	    	System.out.println("请输入:");
	    	String next = scanner.next();
	    	try {
	    		Channel next2 = netServerMuch.next();
	    		next2.writeAndFlush(next);
	    	}catch (Exception e) {
	    		e.printStackTrace();
			}
	    }
	}

カスタム直列化プロトコルでシリアル化協定

シーケンスの定義

シリアライゼーション(直列化)バイナリ形式(バイト配列)中に標的配列であり、典型的には、(エンコード)を符号化する配列と呼ばれる、主にネットワーク伝送、データの永続性等のために使用され、
デシリアライズ(デシリアライズ)であります復元されたネットワーク、ディスク、等からのバイトの配列は、一般的にリモート呼び出しを完了するために、伝送ネットワークのメインオブジェクトを復号化するため、復号化(デコード)をデシリアライズするために呼ばれる、後続の操作を行うために、元のオブジェクトを読み取ります。
シリアル化協定「創始者」
私は最初の直列化プロトコルのJava直列化機構は、デフォルトで提供されて知っている、Javaオブジェクトをシリアル化する必要が唯一のシリアライズ/外部化インタフェースを実装し、IDのシーケンスを生成する必要がある、このクラスとのObjectInputを渡すことができるようになりますObjectOutputシリアライズとデシリアライズ

ジャワの欠点は、シリアライズ

自分自身の直列化を提供し、また使用することは非常にシンプルですが、リモートサービスの呼び出しはほとんどそれを使用しないJavaの主に次のような欠点があります

言語を横断することができません:私は、Javaのシリアライズのバイト配列は、他の言語は、デシリアライズすることができないので、Javaの直列の開発のための致命的な「間違い」だと思います。;
ストリームは、現在主流には大きすぎる相対シリアライズ::シリアル化プロトコルを、ストリームもJavaのシリアライゼーションである
演奏の差配列:Javaのシリアライゼーションため現在主流に対して、IO同期ブロックを使用して直列化プロトコルは、その効率が非常に悪いです。
シリアライゼーションの性能に影響を与える主要な要因
、ストリームサイズシリアライズ(ネットワーク帯域)
の性能(CPUリソースの消費)の配列;
支持クロス言語(ドッキングおよび異種システム開発言語の切り替え)。

ネッティーシリアライズ

オブジェクト

パブリッククラスTransportObject実装Serializableを{
/ **
*
* /
最終長いserialVersionUIDの= -4128002851096643251Lプライベート静的。
プライベート文字列名;
プライベートint型のID。
プライベートリストリスト=新しいArrayListを();

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public List<String> getList() {
    return list;
}

public void setList(List<String> list) {
    this.list = list;
}

@Override
public String toString() {
    return "TransportObject{" +
            "name='" + name + '\'' +
            ", id=" + id +
            ", list=" + list +
            '}';
}

}
サーバー

public class TranspoertObjectServer {
private static int port = 7777;
public static void start() {
	ServerBootstrap bootstrap = new ServerBootstrap();
	EventLoopGroup boss = new NioEventLoopGroup();
	EventLoopGroup worker = new NioEventLoopGroup();
	try {
		bootstrap.group(boss, worker);
		bootstrap.channel(NioServerSocketChannel.class);
		bootstrap.option(ChannelOption.SO_BACKLOG, 2048);
		bootstrap.childOption(ChannelOption.SO_KEEPALIVE, true);
		bootstrap.childOption(ChannelOption.TCP_NODELAY, true);
		bootstrap.childHandler(new ChannelInitializer<Channel>() {
			@Override
			protected void initChannel(Channel ch) throws Exception {
				ch.pipeline().addLast(new ObjectEncoder());
				ch.pipeline().addLast(new ObjectDecoder(Integer.MAX_VALUE, ClassResolvers.cacheDisabled(null)));
				ch.pipeline().addLast(new ObjectServerHandler());
			}
		});
		ChannelFuture channelFuture = bootstrap.bind(port);
		System.out.println("server start");
		channelFuture.channel().closeFuture().sync();
	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		boss.shutdownGracefully();
		worker.shutdownGracefully();
	}
}

public static void main(String[] args) {
	start();
}

}
publicクラスObjectServerHandlerはChannelInboundHandlerAdapter {延び
@Override
公共ボイドchannelRead(ChannelHandlerContext CTX、オブジェクトMSG)は例外{スロー
するSystem.out.println(MSG)を、
ctx.writeAndFlush(MSG)。
}

@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
    super.channelInactive(ctx);
}

@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
    System.out.println(cause.getMessage());
    ctx.close();
  //  super.exceptionCaught(ctx, cause);
           }
    }

クライアント

public class TranspoertOjectClient {
 private static int port = 7777;
    private static String ip = "localhost";
    public static void connect(){
        Bootstrap bootstrap = new Bootstrap();
        EventLoopGroup worker = new NioEventLoopGroup();
        try{
            bootstrap.group(worker);
            bootstrap.channel(NioSocketChannel.class);
            bootstrap.handler(new ChannelInitializer<Channel>() {
                @Override
                protected void initChannel(Channel ch) throws Exception {
                    ch.pipeline().addLast(new ObjectEncoder());
                    ch.pipeline().addLast(new ObjectDecoder(Integer.MAX_VALUE,
                            ClassResolvers.cacheDisabled(null)));
                    ch.pipeline().addLast(new ObjectClientHandler());
                }
            });
            ChannelFuture channelFuture = bootstrap.connect(ip, port).sync();
            channelFuture.channel().closeFuture().sync();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            worker.shutdownGracefully();
        }
    }
    public static void main(String[] args) {
        connect();
    }
 }
   public class ObjectClientHandler extends ChannelInboundHandlerAdapter {
private TransportObject getTransportObject(){
    TransportObject to = new TransportObject();
    to.setId(10001);
    to.setName("xiaowang");
    to.setList(Arrays.asList("zhangsan","lisi","wangwu"));
    return to;
}
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
    System.out.println("active");
    super.channelActive(ctx);
    //发送消息给服务端
    ctx.writeAndFlush(getTransportObject());
}
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
    super.channelInactive(ctx);
}
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
    System.out.println(msg);
    ctx.close();
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
//super.exceptionCaught(ctx, cause);
    System.out.println(cause.getMessage());
    ctx.close();
}

}

XML

(1)定義:
XML(拡張マークアップ言語)は、1998年にバージョン1.0から、それは長い歴史があり、一般的なシリアライズとデシリアライズのプロトコルであり、今日広く使用されています。
(2)の利点
マンマシン可読性
要素またはプロパティの名前を指定することができるが
(3)の欠点
シリアル化されたデータ構造は、データ自体を含ま、等、及びプログラムタイプ識別子は、設定情報が含まれていません。
デフォルトコンストラクタによってシリアライズクラスのXmlSerializerが存在する必要があります。
パブリックプロパティとシーケンスフィールドのみが
メソッドシリアル化することができる
伝送の帯域幅を表すファイル、大規模で複雑なファイル・フォーマット、
シーンを使用して(4)
プロファイルデータストアとして
リアルタイムデータ変換

JSON

(1)定義:
JSON(JavaScriptオブジェクト表記、JSオブジェクトタグ)軽量データ交換フォーマットです。これは、一部のECMAScriptの(W3C開発JS仕様)に基づいており、JSONはテキスト形式でプログラミング言語とは何の関係も使用していませんが、また、(C、C ++、C#、を含むクラスC言語を使用するJavaやJavaScript、PerlやPython など、)習慣、簡潔かつ明確な階層メイクJSON理想的なデータ交換言語。
(2)の利点
前部高い互換性の
データフォーマットは、単純な、読みやすい
小さい、良好なスケーラビリティ後のシーケンスデータを、互換性の
速い比較的簡単であるプロトコル、分析、XMLと比較して
(3)の欠点の
データXML差がより記述的
MSレベルの場合の性能要件に適していない
余分なスペースオーバーヘッドが比較的大きい
シーンに適した(4)(あるいはXML)
ファイアウォールのアクセスを横切る
高調整可能要件の場合は、
AjaxのリクエストのWebブラウザベースの
転送量データは、対応します小さな、比較的低いリアルタイム要件(例えば、第二レベル)サービス

高速JSON

定義された(1)
Fastjsonは、Java言語はJSONライブラリを備えた高性能でよく書かれています。それは極端にアルゴリズム、JSON解析のパフォーマンスを「迅速かつ秩序が一致すると仮定」を使用しています。
(2)の利点
インタフェースは使いやすいです
、現在最速のJava言語のJSONライブラリ
の(3)の欠点
、高速を強調しすぎると、そして「標準」と機能から逸脱し
たコードの品質が高くない、不完全なドキュメント
(4)は、シーンの適用
契約インタラクティブ
のWeb出力を
Androidのクライアント

倹約

(1)定義:
倹約及びプロトコルだけではなく配列が、フレームRPC。それはあなたが、一般的に、トランスポートプロトコルのバイナリ型を使用して、帯域幅を節約し、伝送効率を提供するために、クライアントとサーバ、すなわち、テキスト(文章)とバイナリ(バイナリ)の伝送プロトコルとの間の通信プロトコルの伝送のカテゴリを選択することができます。
(2)の利点
シリアライゼーション後小体積、速度
支持複数言語およびリッチデータ型
強いとデータフィールド削除互換性のために
バイナリ圧縮符号化のサポート
(3)の欠点の
少ないユーザ
ファイアウォールアクセスタイムを横切って、安全でない
比較的難しいコードをデバッグ、可読でない
(HTTPなど)、他のトランスポート層プロトコルと組み合わせることができないことは
それがデータの永続シリアル化プロトコルには適していない、直接データを読み書き永続層をサポートしていない
該当シーン(4)
RPC分散型システムソリューション

ユーロ

(1)定義:
アブロはサブのApache Hadoopのに属します。JSON形式またはバイナリ形式:アブロは、2つのシリアル・フォーマットを提供します。スペースのオーバーヘッドと分析性能でバイナリ形式といるProtobufのライバル、アブロはJSONが長い解決し、何のIDLの問題作成
(2)の利点
豊富なデータ型のサポートは、
単純な動的な言語バインディング機能
の自己記述属性は、
データ分析を改善しませんスピード
速い圧縮可能なバイナリデータは
リモート・プロシージャ・コールRPCの可能
サポートクロス言語プログラミング
(3)短所
静的型付け言語に慣れているユーザーのための直感的ではない
(4)シーンが適用される
のHadoopのHiveの、豚にやるとMapReduceの持続性データ形式

いるProtobuf

(1)定義
グーグル内にしようとした試験、Googleがオープンソースからプロトコルバッファを。ファイルのデータ構造を説明する.protoこれは、オブジェクトに対応するデータは、コード生成ツールを介してPOJOいるProtobuf構造と関連するメソッドとプロパティを生成することができます。
(2)の利点
シリアライズストリーム小さなは、高い性能
構造化データ・ストレージ・フォーマット(XML、JSONなど)
シーケンシャル識別フィールドによっては、プロトコルフォワード互換性を達成することができる
構造化文書および保守管理が容易
(3)の欠点の
必要性をツールに依存しますが、コード生成
、比較的少数の職員が唯一のJava、C ++、Pythonのサポートによってサポートされる言語
(4)該当シーン
RPCコールの高いパフォーマンス要件の
良いクロスファイアウォールアクセス特性を有する
アプリケーションレイヤオブジェクトの永続化に適しました

公開された26元の記事 ウォンの賞賛0 ビュー695

おすすめ

転載: blog.csdn.net/YHM_MM/article/details/104021031