为什么 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 服务。
我的 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 服务。