1

我将 Java Spring 后端部署到 GAE 灵活环境。我正在使用netty-socketio来托管 socketIO 服务器。我可以使用为此处列出的实例提供的公共 IP 地址与socket.io-client连接:

在此处输入图像描述

这就是我连接它的方式:

const io = require("socket.io-client");

const socket = io("ws://<IP adress>:<PORT>", {
    reconnectionDelayMax: 10000,
    query: {
      "deviceId": serial
    }
});
  
socket.on("connect", () => {
    console.log("Connected. Session ID: " + socket.id);
});

请注意,netty-socketio 仅支持 1.0+ 版本,所以我使用的是 socket.io-client 1.7.4,它不是最新版本。

我也在使用自定义域。我的问题是我只能使用 IP 地址连接到服务器,但是当我使用域名时出现超时错误:

socket.io-client:url parse ws://<DOMAIN>:<PORT> +0ms
  socket.io-client new io instance for ws://<DOMAIN>:<PORT> +4ms
  socket.io-client:manager readyState closed +3ms
  socket.io-client:manager opening ws://<DOMAIN>:<PORT> +0ms
  socket.io-client:manager connect attempt will timeout after 20000 +48ms
  socket.io-client:manager readyState opening +6ms
  socket.io-client:manager connect attempt timed out after 20000 +20s
  socket.io-client:manager connect_error +2ms
  socket.io-client:manager cleanup +1ms
Connect error: timeout
  socket.io-client:manager will wait 868ms before reconnect attempt +2ms
  socket.io-client:manager attempting reconnect +870ms
  socket.io-client:manager readyState closed +0ms
  socket.io-client:manager opening ws://<DOMAIN>:<PORT> +1ms
  socket.io-client:manager connect attempt will timeout after 20000 +4ms

这就是我想连接的方式:

const io = require("socket.io-client");

const socket = io("ws://<DOMAIN>:<PORT>", {
    reconnectionDelayMax: 10000,
    query: {
      "deviceId": serial
    }
});
  
socket.on("connect", () => {
    console.log("Connected. Session ID: " + socket.id);
});

到目前为止,我为使其正常工作所做的事情:

  • 我正在使用app.yaml以下配置进行网络会话:
network:
  session_affinity: true
  forwarded_ports:
    - <PORT>/tcp
  • 我制定了防火墙规则以允许在我尝试连接的端口上进行连接: gcloud compute firewall-rules create default-allow-websockets --allow tcp:<PORT> --description "Allow websocket traffic"

我当然可以这样使用它,但是一旦我停止并重新启动实例,这个 IP 就会不断变化。希望你能给我一些建议!

4

1 回答 1

0

您知道您的主机名是否在您的应用程序中解析吗?很多时候,像这样的服务可以使用拆分 DNS,因此您的代码可能无法解析您期望的相同公共 IP。

我建议进行一次快速测试,看看你的<DOMAIN>决心是什么,以确保它是你所期望的。

于 2021-03-18T16:16:04.463 回答