netty学習ノート【更新を続ける】

7062 ワード

git :https://github.com/chris1132/netty_lecture
2018-7-20
netty
https://blog.csdn.net/u010530712/article/details/82107187
2018-7-22
クライアントとサービス側のtcp双方向通信に基づく実現
ソースコードhttps://github.com/chris1132/netty_lecture/src/main/java/com/chovy/netty/secondeexample 2018-7-24
1、netty servlet ;
2、http , netty tcp , serversocket;
3、 springmvc , jetty、Tomcat servlet , , netty, keepalive

2018-7-25
1、nettyは要求ルーティングにサポートを提供していない.
2、nettyはsocket関連開発を完成する;長接続開発をサポートする.
3、websocketはクライアントとサービス側の持続的な接続を実現し、互いにメッセージを送ることができる.httpのヘッダーなどの不要なメッセージをカプセル化する必要はありません.
2018-7-26 1、SimpleChannelInboundHandler T汎用、処理するメッセージのJavaタイプ;2、ChannelHandler、ChannelHandlerContext、ChannelPipelineの3つの関係は特別で、相補的であり、1つのChannelPipelineには3つ以上のChannelHandlerインスタンスがあり、各ChannelHandlerインスタンスとChannelPipelineとの間の橋渡しはChannelHandlerContextインスタンスであり、ChannelHandlerContextはリモートアドレスを取得するなどのコンテキスト情報を取得するために使用される.1つのチャネルPipelineに複数のチャネルHandlerがある場合、これらのチャネルHandlerに同じメソッドがある場合、例えばチャネルActiveメソッドは、ctxのように最初のチャネルHandlerにあるチャネルActiveメソッドのみを呼び出す、後続のチャネルHandlerの同名メソッドを呼び出すには「fire」で始まるメソッドを呼び出す必要がある.fireExceptionCaught(cause);
3、EventLoopGroup boss = new NioEventLoopGroup(); EventLoopGroup worker = new NioEventLoopGroup();
NioEventLoopGroupは、I/O動作を処理するためのマルチスレッドイベントループであり、Nettyは、異なる伝送プロトコルを処理するために多くの異なるEventLoopGroupの実装を提供する.2つのNioEventLoopGroupが使用されるサービス・エンドの応用を実現した.最初はよく「boss」と呼ばれ、入力された接続を受信するために使用されます.2つ目はよく「worker」と呼ばれ、受信した接続を処理し、「boss」が接続を受信すると、接続情報を「worker」に登録する.どのスレッドが使用されているかをどのように知るか、作成されたchannelにどのようにマッピングするかは、EventLoopGroupの実装に依存し、関数を構築することによって関係を構成する必要があります.
サーバー側bootstrap.childHandlerクライアント:bootstrap.handler handlerはbossに対して機能し、boss関連情報を処理し、例えば、接続した後、関連ログ出力を処理する.childhandlerはworkerに対して、bossは接続をworkerに渡した後、childhandlerの中のオブジェクトがworkerの中のnioスレッドに作用します
2018-7-27
Nettyマルチクライアント接続と通信はマルチクライアント接続を実現し、需要1:A、B、C-』Server、1、A接続、2、B接続、S印刷B接続、S通知A、Bオンライン、3、Cオンライン、S印刷Cオンライン、ABに放送し、Cオンライン需要2:ABCに接続を確立することを通知し、A送信メッセージ、ABCはすべてメッセージを受け、Aは自分で送信したメッセージを表示し、BC表示メッセージはAから
handlerAddedにより、追加されたchannelを取得し、channelgroupを使用してchannelグループ内の既存のチャネルにブロードキャストします.
ソース番号https://github.com/chris1132/netty_lecture/src/main/java/com/chovy/netty/thirdexample##netty読み書き検出メカニズムと長接続要素――心拍数
1、携帯電話側とサーバー側は長い接続を確立して、クライアントはアプリケーションを脱退していないで、それからクライアントは飛行モードを開いて、サーバー側とクライアントは接続が切れたことを感知することができなくて、相応の方法例えばhandlerRemoved方法は呼び出さない.心拍数により,appはサーバ側に心拍数パケットを送信し,サーバ側が受信した後,appにackを送信する.クライアントが長い間フィードバックメッセージを受信できなかった場合、切断
2、IdleStateHandlerは空き状態を検出し、読み書き操作の有効時間を設定するために使用され、userEventTriggeredはあるイベントがトリガーされた後にこの方法を呼び出し、イベントをパイプpipelineの次のhandlerオブジェクトに転送する.userEventTriggeredイベントがトリガーされた後にメソッドを呼び出し、イベントをパイプpipelineの次のhandlerオブジェクトに転送します.
ソース番号https://github.com/chris1132/netty_lecture/src/main/java/com/chovy/netty/fourthexample2018-7-30
Nettyのwebsocketサポート
一、websocketはhttpに存在する問題を解決し、1、httpは無状態であり、クライアントは2回の要求を送信し、プロトコル自体から2回の関係、どのような情報が保存されているかを識別することができず、cookie、sessionがこれらの問題を解決するために使用され、2、要求応答モードに基づくプロトコル、http 1.0ではリクエストとレスポンスの前に接続が確立され、リクエストの開始者はブラウザであり、レスポンスが完了すると接続が切断され、このように繰り返される.HTTP1.1,keep-aliveを追加し、クライアントとサービス側は短時間の持続的な接続を維持し、この時間内にクライアントとサービス側は1つのリンクしか確立せず、その後の要求はこの接続を多重化する.
二、偽長接続、ポーリングの終了を運用し、クライアントはタイミング的に要求を出し、httpは2つの部分を含み、headerとbody、headerは必ず持ち、ヘッダ情報の占有サイズは内容よりはるかに大きい.
三、websocketはブラウザとサーバーの間の長い接続を実現し、双方は対等な実体であり、互いに情報を発信することができる.長接続は初回確立時にクライアントがサービス側に要求(ヘッダ情報を含む)を送信し,その後ヘッダ情報を含まずにデータ自体を真に送信する.
Websocket自体はhttpプロトコルに構築されたアップグレード版プロトコルであり、クライアントはサーバ側に接続の確立を要求し、headerにはwebsocket関連のパラメータが携帯されており、これらのパラメータに基づいて、サービス側はupgradeという操作でhttp接続をwebsocketにアップグレードする
Websocketはhtml 5仕様の一部です
2018-7-31
1、nettyは処理要求に対してブロックあるいはセグメント方式で、クライアントはサービス側に要求を送信して、長さ1000、nettyは10セグメントに分けることができて、各セグメントは1つの完全な流れを歩いて、私達の自分のプロセッサのchannelread 0、1セグメントまでしか読めません
2、H ttpObjectAggregator(len)はセグメント化された要求(応答)を1つの完全な要求(応答)に集約し、lenはバイトで内容の最大長を集約し、集約された内容が長さを超えた場合、handleOversizedMessageを呼び出す
3、WebSocketServerProtocolHandlerはwebsocketに関する重い仕事を処理し、握手を接続したり、心拍に関する内容を処理したりします.WebSocketServerProtocolHandler(「/ws」)のうち/wsはws://localhost:8899/'ws'WebSocketServerProtocolHandlerのようなwebsocket uriのアドレスを指します.
##nettyはサービス側とクライアントの長い接続通信を実現する
ソースコードhttps://github.com/chris1132/netty_lecture/src/main/java/com/chovy/netty/fifthexampleの需要、ウェブページがwebsocketを通じてデータを送信することを実現し、サービス側が受け取った後のフィードバックメッセージはブラウザのws:/localhost:8899/ws headerの中で、Status Code:101 Switching Protocols、変換プロトコルhttp->wsは要求ヘッダの中でRequest Headersの中でUpgrade:websocket、wsという要求にアクセスするが、httpは先に接続を確立し、確立が完了した後、さらにupgrade(アップグレード)をwebsocketにアップグレードするので、websocketはhttp上のプロトコルです
2018-8-1
##google protobufの使い方
ソースコードhttps://github.com/chris1132/netty_lecture/src/main/java/com/chovy/netty/sixthexample一、protobufはrpcデータ伝送を行い、プロトコルをカスタマイズするために用いられ、データ符号化復号、すなわちシーケンス化逆シーケンス化(符号化、復号)プロセスをよりよく、より小さい体積で行うことができる.rpc開発でよく使われるライブラリ2、RMI:remote method invocation、リモートメソッド呼び出し.(javaのみの場合、clientとserverはjavaでなければならない)クライアント:stub、サービス側:skeletonはネットワークを介して伝送され、A->(呼び出されたオブジェクト、メソッド、パラメータ)はバイトコード-"ネットワーク伝送-"B-"はバイトコードを受信し、逆シーケンス化は特定のオブジェクト、メソッドを呼び出す.RPC:remote procedure callリモートプロシージャ呼び出しは、クライアント用python、サービス側javaなどの言語間呼び出し、クライアントは独自のメソッドを呼び出し、サービス側のメソッドRPC記述モードをトリガすることができます.1、インタフェース説明ファイル(idl):オブジェクト、オブジェクトメンバー、インタフェースメソッドなどの一連の情報を記述します.2、rpcフレームワークが提供するコンパイラにより、インタフェース説明ファイルを具体的なファイル3にコンパイルし、クライアントとサーバ側にRPCコンパイラが生成したファイルをそれぞれ導入すれば、ローカルメソッドを呼び出すようにリモートメソッドを呼び出してrpcフレームワークの効率を決定することができる.2018-8-2 protocol-bufferを用いてオブジェクトを構築し、コーデックニーズを実現し、クライアントA、サーバB、Aがオブジェクトを構築し、サーバ側に送信し、Bが受信した後、オブジェクト情報を印刷し、別のオブジェクトをAに送信する.
protoファイルでjavaコード命令を作成し、protoc-I=src/protobuf--java_out=src/main/java src/protobuf/StuffInfo.proto
2018-8-3昨日に続いて、すでに昨日の需要を完成して、問題を解決しなければなりませんpipeline.addLast(new ProtobufDecoder(StuffInfo.Teacher.getDefaultInstance()))  //StuffInfo.Teacher符号化オブジェクトは書きにくく、柔軟ではありません.
2018-8-6解決策は、送信メッセージの外にもう一つの層を包んで、StuffInfoを参照する.protoは、列挙により各メッセージタイプを列挙し、今度のメッセージタイプnettyがprotocolbufferというデータ転送プロセスに基づいて、どの方法やデータタイプで要求を処理するかについて、判断が煩雑な問題がある.受信者は、相手がどのデータ型を送信したかを判断し、if-elseで一致するデータ型を探し、springmvcはnettyと比較して、@RequestMapping(value="./xx/",method=RequestMethod.GET)のように、springmvcパスルーティングが明確で直感的であるように、次の処理方法について説明する.springmvcにはdispatcherServicelet(コントローラ)があるため、cがsに発起したすべてのリクエストは、dispatcherServiceletを経て、異なるcontrollerに配布され、springmvcは起動時にurlとメソッドの対応関係を見つけ、対応関係をmapなどの保存し、sが受け取ったらurlで具体的な方法にマッチングします.
Gitをバージョン管理システムとして使用
提案しません.git submodule:git倉庫の中の倉庫、例えばnetty_lectureは既存のプロジェクトであり、protobufが生成したjavaコードはprotobuf-javaプロジェクトであり、git submoduleによってprotobuf-javaをnetty_に導入するlecture、protobuf-javaローカルが変化した場合、リモートウェアハウスをコミットした後、netty_に切断します.lectureディレクトリの下でgit pullでprotobuf-javaをnetty_に更新lecture.問題:分岐切替が乱れ、Aに中間工事Bを導入し、AでBを修正し、Bをリモート倉庫に更新すると、エラーが発生する
アドバイス.git subtree
##io、nio回顧https://blog.csdn.net/u010530712/article/details/82021416
2018-8-27
###ゼロコピーの詳細分析とユーザー空間とカーネル空間の切り替え方式###
https://blog.csdn.net/u010530712/article/details/82146380