2015-09-29 56 views
8

爲了說服一些人從舊學校技術轉換,我需要構建一個聊天演示應用程序,它使用Java(如Node.Js stuff)來管理超過10K個併發連接。如何使用Vert.x 3通過websocket管理連接的用戶?

我測試過Netty 5.0這很棒,但需要做很多工作;另一方面碼頭 9.3是偉大的但比其他競爭對手相對緩慢。

一些搜索後,我發現了Vert.x 3工具包,這是基於Netty的與偉大的工具過多(無需推倒重來),我已經看到了混帳的例子,我能建立一個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); 
} 

作爲新來的Vert.x世界,我無法弄清楚如何使用它來管理連接的用戶,通常舊的方式方法是使用這樣的:

HashMap<UUID,ServerWebSocket> connectedUsers; 

當連接建立時,我檢查它是否存在;如果沒有,我把它添加爲一個新的條目,並做一些功能發送,廣播,檢索通過收集等。

我的問題是不Vert.x 3有事要處理的連接來跟蹤他們,並刪除那些離開誰(乒乓球),廣播等或者我應該使用Cookie,會話從頭開始實現它們。 ...)

我找不到使用Vert.x 3.

+0

說服他們的是什麼?您可以處理成千上萬個連接,並將代碼寫入到20世紀80年代可用的API中。 – EJP

+0

我想使用異步方法並減少硬件你看到了嗎? – merou

回答

0

基本上任何真實的例子,在websocketHandler的範圍代表的連接。在你的例子中,這是你的匿名類。我創建了一個小websocket聊天example,我使用Vert.x事件總線將消息分發給所有客戶端。

在服務器的啓動方法中,我們處理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

當客戶端失去連接(平面模式)時,服務器不會檢測到它。 – mstafkmx

相關問題