使用 VertX 将消息从 eventbus 桥接到订阅的 websocket 客户端 [英] Bridging messages from eventbus to subscribed websocket clients using VertX

查看:77
本文介绍了使用 VertX 将消息从 eventbus 桥接到订阅的 websocket 客户端的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用 websocket 创建一个发布 - 订阅模型,该模型可以通过 SockJS 和 Websocket 访问(一方面用于 Javascript 客户端,另一方面用于 Java 客户端.

I'm trying to use websocket to create a publish-suscribe model which can be reached through both SockJS and Websocket (for Javascript clients on one side, and for Java clients on the other.

目前我可以使用 SockJS 和 Javascript 客户端进行订阅.但是,当我尝试使用 websocket 在我的 Java 客户端中接收消息时,我能够连接到 websocket 服务器,但没有从服务器接收任何消息.

Currently I'm able to subscribe using SockJS and Javascript clients. However, when trying to use websocket to receive messages in my Java client, I am able to connect to the websocket server, but don't receive any messages from the server.

我当前的客户端代码:

public class WebsocketReceiverIntegrationTest {
    public static void main(String[] args) {
        System.out.println("Started demo WS client");
        HttpClient client = Vertx.vertx().createHttpClient();

        System.out.println("Will now connect to WS server");
        client.websocket(8091, "localhost", "/", webSocket -> {
           webSocket.handler( data -> {
                System.out.print("Received data " + data.toString("ISO-8859-1"));
           });
        });

        System.out.println("Ready to receive data");

        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext() && ! scanner.next().equals("q")) {
        }

        System.out.println("Stopped");
        client.close();
    }
}

我当前服务器代码中的相关部分:

Relevant bit in my current server code:

@Override
public void start(Future<Void> fut) {
    Router router = Router.router(vertx);

    router.route("/eventbus/*").handler(sockJSEventBusHandler());

    router.route().failureHandler(errorHandler());

    vertx.createHttpServer().websocketHandler(serverWebSocket -> {
        System.out.print("Websocket client connected!");
        vertx.eventBus().consumer(serverWebSocket.textHandlerID());
    }).listen(8091);

    vertx.setPeriodic(1000, id -> {
        vertx.eventBus().send("gameupdates", Json.encodePrettily(tickGameState()));
    });
}

private SockJSHandler sockJSEventBusHandler() {
    BridgeOptions options = new BridgeOptions().addOutboundPermitted(new PermittedOptions().setAddress(GAMEUPDATE_CHANNEL_NAME));
    return SockJSHandler.create(vertx).bridge(options, event -> {
        if (event.type() == BridgeEventType.SOCKET_CREATED) {
            logger.info("A socket was created");
        }
        event.complete(true);
    });
}

推荐答案

请注意,SockJS 协议支持来自 常规 websocket 客户端.例如,如果您在 /api/realtime 注册了 SockJSHandler,那么您应该能够使用您的 websocket 客户端连接到 /api/realtime/websocket.

Note that the SockJS protocol supports connections from regular websocket clients. For example, if you have the SockJSHandler registered at /api/realtime, then you should be able to connect to /api/realtime/websocket with your websocket client.

这篇关于使用 VertX 将消息从 eventbus 桥接到订阅的 websocket 客户端的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆