为什么 Vertx 服务器无法与通过 WSL 托管的节点服务器通信? (MWE提供)

Why is Vertx server unable to communicate with node server hosted via WSL? (MWE provided)

我的 Vertx 后端服务器无法通过 WSL 将 HTTP (GET) 请求发送到同一台机器上的节点服务器 (typescript) 运行。但是,通过 Postman,我可以向节点服务器发送 HTTP (GET) 请求。

我将提供一个最小的、可行的例子:

首先,localhost 使用以下 config 托管节点服务器:

  "dependencies": {
    "@types/express": "^4.17.12",
    "express": "^4.17.1"
  },
  "devDependencies": {
    "@types/node": "^15.14.0",
    "ts-node": "^9.1.1",
    "typescript": "^4.3.5"
  }

index.ts:

const express = require('express')
const app = express()
const port = 8081

app.get('/', (req, res) => {
    console.log("standard route called");
    res.send('Hello World!')
})

app.listen(port, () => {
    console.log(`Example app listening at http://localhost:${port}`)
})

后端服务器是 Vertx 服务器 (Vertx 4.0.2),它使用 Vertx Web 客户端向“localhost:8081/”发送 HTTP GET 请求:

package org.example

import io.vertx.reactivex.core.Vertx
import io.vertx.reactivex.ext.web.Router
import io.vertx.reactivex.ext.web.client.WebClient

fun main(args: Array<String>) {

    val vertx = Vertx.vertx()
    val router = Router.router(vertx)

    val webClient = WebClient.create(vertx)

    webClient.get(8081, "localhost", "/").rxSend().subscribe { result ->
        println(result.statusMessage())
    }

    vertx.createHttpServer().requestHandler(router).listen(8080)


}

启动顶点服务器(并发送 HTTP GET)时出现以下错误:

Caused by: io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: no further information: localhost/127.0.0.1:8081 Caused by: java.net.ConnectException: Connection refused: no further information at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717) at io.netty.channel.socket.nio.NioSocketChannel.doFinishConnect(NioSocketChannel.java:330) at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:334) at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:702) at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:650) at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:576) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493) at io.netty.util.concurrent.SingleThreadEventExecutor.run(SingleThreadEventExecutor.java:989) at io.netty.util.internal.ThreadExecutorMap.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.lang.Thread.run(Thread.java:748)

重要的是要注意实际的节点服务器是通过 WSL 托管的,因为它使用仅在 Linux 中可用的库。当节点服务器通过 Windows (localhost) 托管时,Vertx 服务器可以访问。为什么Vertx服务器无法访问通过WSL托管的本地节点服务器?为了使这成为可能,我需要做什么?

事实证明,您可以通过 IPv6“::1”访问 Windows 本地托管的 WSL 服务。