【发布时间】: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