如何从设备上的本地主机连接到通过公共互联网上的IP连接? (socket-io、express、phaser)

问题描述 投票:0回答:2

我正在尝试开发一个在线浏览器游戏,虽然我无意购买域名或云托管它,但我希望能够在我的计算机上运行服务器并让人们通过浏览器连接来玩在线游戏其他设备、其他网络。我已经使用 socket-io、express 和 Phaser 开发了游戏,并且已经达到了可以玩游戏的程度,并且在运行服务器的计算机上的不同选项卡之间具有完整的多人游戏功能。我正在努力找出代码和端口转发更改以使其在公共互联网上运行。

将其简化为简单的框架,我在根目录中有一个 server.js 文件,如下所示:

const server = require('express')();
const http = require('http').createServer(server);
const host = 'localhost'; const port = 3000;

const io = require('socket.io')(http, {
    cors: { origin: `http://${host}:8080` }
  });

  io.on('connection', function (socket) {
      console.log('A user connected: ' + socket.id);
      socket.on('disconnect', function () { console.log('A user disconnected: ' + socket.id); });
  });

  http.listen(port, host, function () {
    console.log('Server started!');
});

在客户端目录中有一个index.html,它调用以下game.js脚本:

import io from 'socket.io-client';

const hostname = 'localhost'; const port = 3000;
let serverAddress = `http://${hostname}:${port}`;

export default class Game extends Phaser.Scene {
    constructor() {
        super({ key: 'Game' });
    }

    create() {
        this.socket = io(serverAddress);
        this.socket.on('connect', function () { console.log('Connected!'); });
    }
}

从中,我在根目录和客户端目录中运行

npm start
。在浏览器中打开
http://localhost:8080/
时,我会收到服务器进程对用户连接的确认,并在浏览器控制台中收到网页已连接的确认。

我尝试过端口转发以确保socket-io可以公开发送和接收。我没有路由器,但我在调制解调器设置中添加了端口

3000
的 ipv4 转发和我的 PC 的本地 IP (
10.0.0.58
),以及 TCP 和 UDP。我无法真正理解端口转发、端口
3000
8080
以及 Nodejs 服务器和客户端进程之间的关系。

我尝试更改代码以将 localhost 替换为我的公共 ipv4 地址(

xxx.xxx.xxx.234
),whatismyipaddress.com 认为这可能是静态的,但服务器控制台将 http.listen() 识别为抛出错误,因此这不会即使禁用了 Windows Defender 防火墙,这种情况也会发生。无论我在 server.js 和 game.js 中将端口或主机设置为什么,当我在单独的网络上打开另一个设备并输入
xxx.xxx.xxx.234
xxx.xxx.xxx.234:3000
xxx.xxx.xxx.234:8080
或任何我无法得到的内容时连接。

我需要改变什么才能让它正常工作?在其他设备和网络上使用浏览器时,我应该期望在

xxx.xxx.xxx.234:8080
xxx.xxx.xxx.234:3000
上进行连接吗?为什么?为什么我的本地计算机上的浏览器不会在
xxx.xxx.xxx.234:3000
处加载我的游戏,但会在
xxx.xxx.xxx.234:8080
处加载我的游戏,尽管 8080 除了 cors 修复之外没有出现在我的代码中的任何地方?我确信我在这里遗漏了一些明显的东西,因为我只是一个自学的业余爱好者,但如果能弄清楚这一点那就太好了,这样我就可以回去编写游戏了!

javascript node.js express socket.io phaserjs
2个回答
0
投票

原来问题出在我的 ISP(属于),它不提供静态 IP,使用 CGNAT,并且不提供 ipv6。经过仔细遵循本教程,我最终让它工作起来:

https://www.reddit.com/r/selfhosted/comments/u8n5hz/how_to_bypass_cgnat_and_expose_your_server_to_the/


0
投票

这不是移相器问题,这更多的是网络问题/问题。也就是说,为了让其他人能够玩游戏,您还需要注意一些事情:

  • 您的 ISP 不得阻止您想要使用的端口(某些 ISP 阻止传入流量),具体取决于您的提供商,您可能无法阻止
  • 你的ISP必须给你一个静态IP地址(如果你有一个动态的IP地址就更困难了,你需要使用像noip.com这样的服务)
  • 您的“路由器”必须配置为将端口(仅您需要的特定端口)转发到您计算机的 IP
  • 您的计算机需要有一个静态本地 IP,以便路由器可以转发端口。
  • 代码必须反映这个新的 ip/主机情况。

现在具体针对您的问题,

  • 首先,您的游戏使用两个端口8080用于网络服务器/网页,3000用于socket.io。所以这两个端口需要可以通过互联网访问。使用 https://your-external-ip:8080 进行测试。 (bzw.:如果我没记错的话,websockets 可能无法在非 https 网站上工作,如果不是 localhost,您可能需要启用 ssl,检查浏览器控制台,如果有错误)

  • 如果一切正常,您只需更改代码、主机/主机名localhost以及your-external-ip但仅在客户端代码中。

如果您在某个步骤中遇到问题,请务必检查浏览器/开发者控制台是否有错误。

需要明确的是,您在端口 8080 上启动游戏,端口 3000 是您的游戏在后台使用的,这就是为什么您需要转发这两个端口。

© www.soinside.com 2019 - 2024. All rights reserved.