当前位置: 首页 > 知识库问答 >
问题:

Vertx 3-已取消SockJS插座打开

姜业
2023-03-14

我创建了一个新的顶点,它应该响应HTTP请求和SockJS桥接事件。基于这个问题https://stackoverflow.com/questions/41516328和vert. x手册https://vertx.io/docs/vertx-web/java/#_sockjs我创建了这段代码:

爪哇:

    @Override
    public void start(Future<Void> startFuture) throws Exception {
        startHttpServer(startFuture);
        startSockJSHandler();
    }

    private void startHttpServer(Future<Void> startFuture) {
        HttpServer server = vertx.createHttpServer(new HttpServerOptions());
        server.requestHandler(req -> {
            System.out.println("[" + new Date().toString() + "] Request #" + ++requestCount);
            if (req.path().contains("http")) {
                req.response().putHeader("Access-Control-Allow-Origin", "*").end("req_num: " + requestCount);
            }
        }).listen(8080, ar -> startFuture.handle(ar.mapEmpty()));
    }

    private void startSockJSHandler() {
        Router router = Router.router(vertx);
        SockJSHandlerOptions sockJSOptions = new SockJSHandlerOptions().setHeartbeatInterval(2000);
        SockJSHandler sockJSHandler = SockJSHandler.create(vertx, sockJSOptions);
        BridgeOptions bridgeOptions = new BridgeOptions();
        bridgeOptions.addInboundPermitted(new PermittedOptions().setAddressRegex(".*")).addOutboundPermitted(new PermittedOptions().setAddressRegex(".*"));
        sockJSHandler.bridge(bridgeOptions, be -> {
            System.out.println("BRIDGE EVENT: " + be.type().toString());
        });
        router.route("/eventbus/*").handler(sockJSHandler);
    }

JavaScript事件总线客户端:

var sock = new SockJS('http://localhost:8080/eventbus/');

sock.onopen = function() {
  console.log('open');
  sock.send('test');
};

sock.onmessage = function(e) {
  console.log('message', e.data);
  sock.close();
};

sock.onclose = function() {
  console.log('close');
};

HTTP请求/响应工作正常,但SockJS事件不能。在web浏览器“网络”模块中,我只看到一个SockJS请求(http://localhost:8080/eventbus/info).8秒处于“挂起”状态,此后状态更改为“关闭”(最后调用方法onclose()。

我做错什么了吗?

共有1个答案

艾修然
2023-03-14

HttpServer必须将请求委托给路由器。否则什么都不会发生。通常,它被配置为将所有请求委托给路由器

server.requestHandler(router::accept).listen(8080);

参见基本垂直。文档中的x-Web概念。

 类似资料:
  • 问题内容: Java 类有两种方法,分别检查套接字是关闭还是连接。我想知道仅开放的TCP套接字与开放和连接的TCP套接字有什么区别,这与UDP有何不同。 问题答案: 为了把事情简单地说,这是 开放的 是要么等待连接或已与另一个成功连接的插座。当一个套接字被 关闭 ,这意味着这个套接字没有连接不再可用,而且它的资源已被释放。一个已连接的好,这意味着该套接字已连接到另一个。 这样可以 同时打开并连接。

  • 我试图了解Socketchannes和NIO的总体情况。我知道如何使用常规套接字,以及如何为每个客户机服务器创建一个简单的线程(使用常规阻塞套接字)。 所以我的问题是: 什么是袜子通道 当我使用SocketChannel而不是Socket时,额外得到了什么 通道和缓冲区之间的关系是什么 什么是选择器 文档中的第一句话是

  • 我正在使用套接字开发一个简单的聊天应用程序。它是客户机-服务器驱动的。除了这个我找不到的bug,一切都很完美:如果我是第一个连接到服务器的客户机,我收到的每一条消息都会在屏幕上打印一次(就像它应该的那样)。然而,如果我是第二个连接的客户,我收到的每条消息都会打印两次,第三个客户会看到他的消息三次,以此类推 当我通过插座收到东西时,我像这样打印它: 因此,如果我收到用户“charles”发送的消息h

  • 假设我在MongoDB中有以下模式: 每个帖子必须有一个所有者,并且可能有许多贡献者(由所有者添加)。 当所有者或任何贡献者对post对象进行更改时,我需要将该更改实时通知给所有相关的用户(使用Socket。IO)。 但是我对如何做到这一点有一些疑问...我的意思是,我知道 Socket.IO 有一些方法可以向特定用户发出消息,但我们需要知道 SocketID。如何将用户 ID 与套接字 ID 相

  • 当我在电子中运行 socket.io 时,我在开发人员控制台中不断收到此错误。 当我建立它时,插座总是立即断开。我的客户甚至没有得到socket.emit我在连接一建立就得到,直到一两分钟后。 客户端和服务器位于同一版本的socket.io上。 服务器: 客户: 这不是完整的代码,但除了一些其他不应影响连接的侦听器之外,没有其他与websockets交互的内容。 服务器没有显示任何问题。它告诉我每

  • 我目前正在编写一个简单的TCP聊天客户端服务器应用程序,它与套接字一起工作。客户端连接到服务器,一旦被接受,就会创建一个新的工作线程来侦听客户端输入。连接到服务器(端口8818处的localhost)工作正常,但只要工作线程在登录java.net之后开始监听更多客户端输入。SocketException:引发连接重置(请参阅下面的堆栈跟踪)。我知道,此异常的一个可能来源可能是服务器或客户端未正确或