如何使用事件总线从Vertx中的Java服务器的某个地址回复消息到Javascript?

时间:2016-05-06 09:29:51

标签: javascript java vert.x

我从客户端收到消息但是在回复消息的情况下,我尝试了许多方法,但没有结果。

我的JavaScript代码是

    var eb = new EventBus("http://localhost:8080/loginUrl");
    eb.onopen = function () {
        console.log("Connection Open")
    };

    eb.onclose = function () {
        console.log("Connection Close")
    };

    eb.registerHandler("server-to-client", function (message) {
        console.log('received a message: ' + message.body());
    });

    // publish a message
    function sendMes(message){
        console.log("Sending Message "+message);
        eb.send("client-to-server",message,function(callback){
            console.log("Received Message "+callback)
        });
    }

我的Java服务器代码是

Router router = Router.router(vertx);
vertx.createHttpServer().requestHandler(router::accept).listen(8080);
SockJSHandler sockJSHandler = SockJSHandler.create(vertx);
BridgeOptions options = new BridgeOptions();
options.addInboundPermitted(new PermittedOptions().setAddress("client-to-server"));
options.addOutboundPermitted(new PermittedOptions().setAddress("server-to-client"));
sockJSHandler.bridge(options);

router.route("/loginUrl/*").handler(sockJSHandler);

EventBus eb = vertx.eventBus();

eb.consumer("client-to-server").handler(sockJSHand->{
System.out.println("Sending Message "+sockJSHand.body());//It prints the message from client
eb.send("server-to-client","Message");
    });

如何从服务器回复一些消息?

1 个答案:

答案 0 :(得分:0)

您的代码示例似乎很好,几乎看起来像聊天服务器 - 客户端示例应用程序,但您应该使用EventBus#publish API而不是EventBus#send API来允许调度消息在所有注册的处理程序(所有客户端Web浏览器)中。

根据Java docs

  

EventBus publish(字符串地址,                    对象消息)

     

发布消息。   该消息将传递给注册到该地址的所有处理程序。

服务器端代码的更新如下:

Router router = Router.router(vertx);
vertx.createHttpServer().requestHandler(router::accept).listen(8080);
BridgeOptions options = new BridgeOptions();
options.addInboundPermitted(new PermittedOptions().setAddress("client-to-server"));
options.addOutboundPermitted(new PermittedOptions().setAddress("server-to-client"));
SockJSHandler sockJSHandler = SockJSHandler.create(vertx).bridge(options);

router.route("/loginUrl/*").handler(sockJSHandler);

EventBus eb = vertx.eventBus();

eb.consumer("client-to-server").handler(
  sockJSHand -> {
    System.out.println("Sending Message "+ sockJSHand.body());//It prints the message from client
    eb.publish("server-to-client", "Message");
  }
);