ネッティーは、オープンソースのフレームワークを使用します
ダボ:アリオープンソースの高性能な通信フレームワークのRPC
RocketMQ:アリは、高性能のメッセージ・キューを作成しました
スパーク:大規模なデータのために設計された計算エンジンを処理します
Elasticsearch、カサンドラ、FLINK、ネッティー-SocketIO、Spring5、プレイ、Grpc ...
ネッティーは何ですか
- ユーザーが迅速に高性能サーバとクライアントを開発するための非同期イベント駆動型のフレームワーク
- JDKおよび高可用性APIを提供し、基礎となるBIO NIOモデルをカプセル化
- 問題を解決するためにスティックパッケージを開梱コーデック来る、ユーザーが唯一のビジネスロジックを気に
- 高い同時接続ミサをサポートするように設計された原子炉のスレッドモデル
- これは、ハンズオンれていない一般的な契約のいずれかの種類を扱うことができるプロトコルスタックの様々な付属しています
ネッティー基本的なコンポーネント
ネッティー例存在しない場合には、クライアントとサーバーの通信
パブリッククラスServerBoot { プライベート静的最終int型のPORT = 8000; パブリック静的無効メイン(文字列[] args){
//启动一个サーバ サーバーサーバー=新しいサーバー(PORT)。 server.start(); } }
サーバー側のコードを次のように:
サーバ・クラス{パブリック プライベートのServerSocketのServerSocket、 公開サーバ(int型ポート){ 試み{
//バインドポートのポート番号に応じて this.serverSocket =新しい新しいServerSocketを(ポート); System.out.printlnはは(「サーバーが正常にポートを開始しました:」ポート+); }キャッチ(IOExceptionを例外){ するSystem.out.printlnは(「サーバの起動に失敗しました」); } } //サーバServerBootブロッキングを回避するために、アプリケーションのメインスレッドを作成し、別のスレッドにポートモニタそうで ます。public voidスタート(){ 新しい新しいThread(Runnableを新新()は{ @Override ます。public void RUN(){ DOSTART(); } })。スタートは(); } //クライアントを受信することは接続されています
DOSTARTプライベート(){無効 ながら、(真の){ 試み{
//クライアントが受信機に接続されているが、ときに、クライアントソケットの上に作成する前に、ブロックする方法を受け入れる ソケット= serverSocket.acceptクライアントを();
//読み取り回避ソケットserverSocket.acceptブロッキング、スレッドClientHandlerの作成する必要があるので、 新しい新しいClientHandlerの(クライアント).start(); }キャッチ(IOExceptionをE){ するSystem.out.println( "例外サーバーを"); } } } }
次のようにClientHandlerのコードは次のとおりです。
ClientHandlerの{クラス公開 のpublic static int型MAX_DATA_LEN決勝= 1024;
//クライアントソケット保存 民間最終ソケットソケット、 公共ClientHandlerの(ソケットソケット){ this.socket =ソケット; } ます。public voidスタート(){ System.out.printlnは( "新しいクライアント・アクセス「); 新新しいThread(Runnableを新新(){ @Override ます。public void RUN(){ DOSTART(); } })スタート(); } 無効プライベートDOSTART(){ 試み{ InputStream InputStreamは=ソケット。 getInputStream();
//クライアントとサーバーが通信 しながら(TRUE){ バイト[]データ=新しいバイト[MAX_DATA_LEN]。 lenはint型。 (!(LEN = inputStream.read(データ))= -1){ながら 文字列メッセージ=新しい文字列(データ、0、LEN)。 System.out.println( "客户端传来消息:" +メッセージ)。 socket.getOutputStream()書き込み(データ)。 } } }キャッチ(IOExceptionを電子){ e.printStackTrace(); } } }
クライアントクライアントコードは次のとおりです。
パブリッククラスクライアント{ プライベート静的最終文字列HOST =「127.0.0.1」。 プライベート静的最終int型のPORT = 9010; プライベート静的最終int型のSLEEP_TIME = 5000; 公共の静的な無効メイン(文字列[]引数)は、IOExceptionがスロー{ 最終ソケットソケット=新しいソケット(HOST、PORT)。 新しいスレッド(新しいRunnableを(){ @Override ます。public void実行(){ System.out.printlnは( "客户端启动成功!"); ながら、(真){ 試み{ 文字列メッセージ= "Hello World"の; のSystem.out。 println( "客户端发送数据:" +メッセージ)。 socket.getOutputStream( ).WRITE(message.getBytes()); }キャッチ(例外e){ System.out.println( "写数据出错!"); } 睡眠()。 } } }))(始めます。 } プライベート静的な無効スリープ(){ 試み{ のThread.sleep(SLEEP_TIME)。 }キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } } }
サービスと通信するためのクライアント・サイドのロジック:
サーバーの視点:
- まず、サービス監視ポート
- (真の)ハンドルクライアント接続にクライアントがサーバーに接続して取得するために、新しい接続を作成する場合は、リンクを受け入れ続け、その後、プロセッサによってながらすることで
- サーバがデータを受信します
- やって処理するサーバー側のビジネスロジック
- サーバーはクライアントにデータを送信します
上記プロセスは相当網状成分を一緒に以下の関係: