服务器未接收到来自客户端的Socket.io发射

时间:2019-12-25 01:08:13

标签: node.js websocket socket.io

我对这件事不屑一顾,因为我以前使用过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,我在浏览器开发工具以及服务器控制台中看到“已连接”消息。到目前为止似乎还不错。单击按钮,然后在控制台中看到“正在发出ping ...”,仅此而已。服务器上没有消息,并且按预期,也没有任何消息返回客户端。好吧,至少没有几秒钟...最终,我在浏览器上看到一个“收到Pong的消息”,这很奇怪,但是我认为这与超时有关,因为我从未在服务器上看到“收到Ping消息”控制台,所以我不确定是什么触发的,但是考虑到大约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地址而不是localhost,但这也没有解决。

起初,我在index.html旁边有一个socket.io.js副本,但由于它似乎更有可能工作,所以切换到从服务器加载它,但只需要提一下,这样您就知道了我所尝试的所有内容。

我还尝试在连接的回调内的客户端上执行socket.on(“ pong”)行,我认为这不是必需的,但认为值得一试,再次无济于事。

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

1 个答案:

答案 0 :(得分:0)

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