2015-09-29 5 views
8

一部の人に古いスクール技術からの切り替えを促すには、のJavaNode.Jsなど)を使用して、10Kを超える同時接続を管理するチャットデモアプリケーションを構築する必要があります。Vert.x 3を使用してwebsocket経由で接続しているユーザーを管理する方法は?

私はNetty 5.0をテストしましたが、これはすばらしいですが、多くの作業が必要です。一方でJetty 9.3は素晴らしいですが、他の競合他社と比較して遅いです。

私は偉大なツールの茄多(車輪の再発明する必要はありません)とネッティーに基づいていますVert.x 3ツールキットを発見したいくつかの検索の後、私はgitのでは例を見てきましたし、私ができましたVert.x世界に新しいビーイングのWebSocketサーバなど

public void start() throws Exception { 
    vertx.createHttpServer().websocketHandler(new Handler<ServerWebSocket>() { 
     @Override 
     public void handle(ServerWebSocket e) { 
      // business stuff in the old style not yet lambda 
     } 
    }).listen(port); 
} 

を構築するために、私はそれを使用して接続しているユーザーを管理する方法を見つけ出すことができませんでした、通常は昔ながらの方法は次のようなものを使用することです:

HashMap<UUID,ServerWebSocket> connectedUsers; 

接続が確立されると、その接続が存在するかどうかを確認します。そうでない場合は、私はそれを新しいエントリとして追加し、送信、ブロードキャスト、コレクションを検索するなどのいくつかの機能を実行します。

私の質問はあるが、Vert.x 3は、それらを追跡し、など、(ピンポン)放送を去った者を、除去するための接続に対処するために何かを持っているか、私はクッキー、セッションを使用して、最初からそれらを実装する必要がありません。 ...)

私はVert.x 3.

+0

何を納得させる?あなたは、1980年代に利用可能だったAPIに書かれたコードで何万もの接続を扱うことができます。 – EJP

+0

私は非同期のアプローチを使用して、ハードウェアを削減したいと思っていますか? – merou

答えて

0

を使用して任意の実際の例を見つけることができませんでした基本的には、websocketHandlerの範囲は、接続を表します。あなたの例では、これはあなたの匿名クラスです。私は小さなwebsocket chat exampleを作成しました。ここでは、Vert.xイベントバスを使ってすべてのクライアントにメッセージを配信しています。

サーバーのstartメソッドでは、websocket接続を処理します。クライアントの切断を監視するcloseHandlerを実装できます。例外、ピンポンなどのハンドラもあります。textHandlerIDを使用して特定の接続を識別できますが、リモートアドレスにもアクセスできます。

public void start() throws Exception { 
     vertx.createHttpServer().websocketHandler(handler -> { 
      System.out.println("client connected: "+handler.textHandlerID()); 

      vertx.eventBus().consumer(CHAT_CHANNEL, message -> { 
       handler.writeTextMessage((String)message.body()); 
      }); 

      handler.textMessageHandler(message -> { 
       vertx.eventBus().publish(CHAT_CHANNEL,message); 
      }); 

      handler.closeHandler(message ->{ 
       System.out.println("client disconnected "+handler.textHandlerID()); 
      }); 

     }).listen(8080); 
    } 

クライアントの例は、Javaで書かれています。これは、受信したすべてのメッセージをコンソールへのwebsocket接続上に出力するだけです。接続後、メッセージを送信します。

public void start() throws Exception { 
     HttpClient client = vertx.createHttpClient(); 

     client.websocket(8080, "localhost", "", websocket -> { 
      websocket.handler(data -> System.out.println(data.toString("ISO-8859-1"))); 
      websocket.writeTextMessage(NAME+ ":hello from client"); 
     }); 

    } 
+0

クライアントが接続を失うと(Planeモード)、サーバーはそれを検出しません。 – mstafkmx

関連する問題