如何使用Vert.x 3在websocket上管理连接用户?

时间:2015-09-29 12:07:59

标签: java websocket vert.x

为了说服某些人从旧学校技术转换,我需要构建一个聊天演示应用程序,使用 Java 管理超过10K的并发连接(如 Node.Js 内容)。

我测试了 Netty 5.0,这很棒,但需要做很多工作;另一方面, Jetty 9.3非常棒,但与其他竞争对手相比速度较慢。

经过一番搜索后,我找到了基于 Netty Vert.x 3工具包,其中包含大量优秀的工具(无需重新发明轮子),我有看到git中的例子,我能够构建一个websocket服务器等等。

let purchaseList = [["purchaseId":1 ,"purchaseCategory" : ["meatballs" ,"burger","cheese" ,"onions" , "apples"]],["purchaseId":2 ,"purchaseCategory" : ["apple","orange" , "olive" , "cheese"]],["purchaseId":3,"purchaseCategory" : ["apple","orange" , "olive" , "cheese" , "Pepsi"]]]

let results = purchaseList.filter { (dictionary) -> Bool in
    if let category = dictionary["purchaseCategory"] as? [String]{
        return category.contains("olive")
    }
    return false
}

作为 Vert.x 世界的新手,我无法弄清楚如何管理使用它的连接用户,通常旧方式是使用类似的东西:

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 3有什么东西要处理跟踪它们的连接并删除那些离开(乒乓),广播等的人,或者我应该从头开始使用cookies实现它们,会话,....)

我使用 Vert.x 3找不到任何真实的例子。

1 个答案:

答案 0 :(得分: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");
        });

    }