【问题标题】:Socket.io emit from client not being received by server服务器未接收到来自客户端的 Socket.io 发出
【发布时间】:2019-12-27 22:08:31
【问题描述】:

我在这个问题上疯了,因为我以前使用过 Socket.io,它运行良好,我将事情归结为一个简单的测试,但它仍然无法运行,所以我真的在这里找人来拯救我的理智!

我在服务器端有以下代码:

const io = require("socket.io");
const server = io.listen(80);

server.on("connection", function(socket) {
  socket.on("ping", function(inData) {
    console.log("ping received");
    socket.emit("pong", { });
  });
  console.log("connected");
  socket.emit("connected");
});

然后,在客户端:

<html lang=""><head><title></title>
<script src="http://localhost/socket.io/socket.io.js"></script>
<script>
  const socket = io.connect("http://localhost");
  socket.on("connected", () => {
    console.log("connected");
  });
  socket.on("pong", () => {
    console.log("pong received");
  });

  function testMe() {
    console.log("Emitting ping...");
    socket.emit("ping", {});
  }

</script>
</head><body>
  <input type="button" value="test" onClick="testMe();">
</body></html>

仅供参考,package.json 为:

{
  "name": "server",
  "version": "1.0.0",
  "description": "",
  "main": "server.js",
  "scripts": {},
  "author": "",
  "license": "ISC",
  "dependencies": {
    "nodemon": "^2.0.2",
    "socket.io": "^2.3.0"
  }
}

使用以下命令启动服务器:

npx nodemon server.js

在浏览器中加载 index.html,我在浏览器开发工具和服务器控制台中看到“已连接”消息。目前看来还不错。我单击该按钮,然后在控制台中看到“Emitting ping ...”,仅此而已。服务器上没有消息,正如预期的那样,客户端上也没有消息。好吧,至少没有几秒钟......最终我在浏览器上看到“收到pong”消息,这很奇怪,但我认为它与超时有关,因为我从未在服务器中看到“ping received”消息控制台,所以我不确定是什么触发了它,但考虑到大约 30 秒后,我正在考虑超时(还要注意,这会继续发生,大约每 30 秒我会看到该消息,而无需单击在第一次之后完全没有按钮 - 不知何故与我在想的 Socket.io 轮询有关?)。

我禁用了我的防火墙,以为它可能被阻止了,但仍然无法正常工作。

我在 Chrome、Firefox、Edge 和 Opera 中尝试过这个,这四个版本都是最新版本,但没有爱,所以它不是特定于浏览器的。

我想可能是因为我直接从文件系统加载 index.html,可能是同域问题,或者可能是 CORS(虽然我没有真正看到如何,并且在控制台就像你通常看到的这样的问题),所以我把它包装在 Express 中(当然是在使用 NPM 添加 Express 之后),如下所示:

const app = require("express")();
const server = require("http").Server(app);
const io = require("socket.io")(server);

server.listen(80);

app.get("/", function (inRequest, inResponse) {
  inResponse.sendFile(__dirname + "/index.html");
});

io.on("connection", function (socket) {
  console.log("connected");
  socket.on("ping", function (inData) {
    console.log("ping received");
    socket.emit("pong", { });
  });
  socket.emit("connected",);
});

这没什么区别,同样的问题。

我尝试使用 IP 地址而不是本地主机,但这也没有解决问题。

我最初在 index.html 旁边有一个 socket.io.js 的副本,但后来切换到从服务器加载它,因为这似乎更有可能工作,但只是提到这一点,以便您了解我尝试过的所有内容。

我还尝试在连接的回调中在客户端上执行 socket.on("pong") 行,我认为这不是必要的,但认为值得一试,但同样没有帮助。

在这一点上我几乎没有想法,这已经让我发疯了几个小时。在这一点上,任何想法都将不胜感激!

【问题讨论】:

    标签: node.js websocket socket.io


    【解决方案1】:

    这个我花了一点时间才抓到! Ping 和 Pong 似乎是 socket.io 中的“保留”词。我使用了与您完全相同的代码(使用 express 作为服务器),但将事件名称更改为“testPing”和“testPong”,它按预期工作。另外,在 GitHub 上链接到这个问题 https://github.com/socketio/socket.io/issues/2414 关于 socket.io 中的 'pong' 和 'ping' 事件

    【讨论】:

    • 哦,哇,我根本没想到!回想起来,它可能应该有,但非常感谢你,那太疯狂了!
    猜你喜欢
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    • 2018-11-02
    • 1970-01-01
    相关资源
    最近更新 更多