通过Vert.x托管WebSocket,通过Socket.IO连接

我在Web服务(在Vert.x的Kotlin上编写)上设置了一个简单的WebSocket,然后通过Mocha / Socket.IO进行测试。

我的网络服务片段非常简单:

httpServer.websocketHandler({ socket -> LOGGER.info("Websocket event!") LOGGER.info(" Path: ${socket.path()}") LOGGER.info(" Query: ${socket.query()}") LOGGER.info(" Headers: ${socket.headers()}") LOGGER.info(" URI: ${socket.uri()}") if (!socket.path().startsWith("/api/v1/ws/auction/")) { LOGGER.warn("Rejecting WS for lack of proper prefix, path: ${socket.path()}") socket.reject() } val split = socket.path().split("/api/v1/ws/auction/") if (split.size != 2) { LOGGER.warn("Rejecting WS for lack of Auction ID, with split: $split") socket.reject() } val auctionId = split[1] vertx.eventBus().consumer("auction.$auctionId", Handler<Message<String>> { message -> LOGGER.warn("Writing WS message with room details!") socket.writeTextMessage(message.body()) }) socket.frameHandler({frame -> LOGGER.info("Handling WS frame: $frame") }) }) 

请注意,随后,我的httpServer 开始监听端口9100。

在Mocha测试运行时,我在服务器日志中看到:

 my-app | 15:14:57.310 [vert.x-eventloop-thread-1] INFO com.craigotis.myapp.web.Application - Websocket event! my-app | 15:14:57.310 [vert.x-eventloop-thread-1] INFO com.craigotis.myapp.web.Application - Path: /api/v1/ws/auction/f2074f6b-b474-45fb-bc86-6c3ff7e532df/ my-app | 15:14:57.311 [vert.x-eventloop-thread-1] INFO com.craigotis.myapp.web.Application - Query: EIO=3&transport=websocket my-app | 15:14:57.311 [vert.x-eventloop-thread-1] INFO com.craigotis.myapp.web.Application - Headers: io.vertx.core.http.impl.HeadersAdaptor@2a8f5b82 my-app | 15:14:57.311 [vert.x-eventloop-thread-1] INFO com.craigotis.myapp.web.Application - URI: /api/v1/ws/auction/f2074f6b-b474-45fb-bc86-6c3ff7e532df/?EIO=3&transport=websocket 

在摩卡/客户端,我使用socket.io ,如下所示:

  var client = io('ws://localhost:9100/api/v1/ws', { path: '/api/v1/ws/auction/' + auctionId, transports: ['websocket'] }); client.on('connect', function () { console.log('WebSocket connected!') }); client.on('event', function (data) { console.log('WebSocket data: ' + data) done(); }); 

但我的摩卡测试超时:

  IO connecting...? socket.io-client:url parse ws://localhost:9100/api/v1/ws +0ms socket.io-client new io instance for ws://localhost:9100/api/v1/ws +0ms socket.io-client:manager readyState closed +1ms socket.io-client:manager opening ws://localhost:9100/api/v1/ws +0ms engine.io-client:socket creating transport "websocket" +0ms engine.io-client:socket setting transport websocket +3ms socket.io-client:manager connect attempt will timeout after 20000 +1ms socket.io-client:manager readyState opening +0ms mocha:runner finished running +5s Error: Timeout of 5000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. 

如果我在命令行上使用wscat作为快速测试,我可以成功连接:

 craig@MyMac:~/projects/myproject$ wscat -c ws://localhost:9100/api/v1/ws/auction/123 connected (press CTRL+C to quit) > 

这是服务器端的配置问题,还是我通过Socket.IO在客户端连接不正确?