我对这件事不屑一顾,因为我以前使用过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”)行,我认为这不是必需的,但认为值得一试,再次无济于事。
在这一点上,我几乎没有想法,这使我疯狂了几个小时。此时任何想法都将不胜感激!
答案 0 :(得分:0)
这花了我一些时间来抓! Ping和Pong在socket.io中似乎是“保留”字眼。我使用了完全相同的代码(使用express作为服务器),但是将事件名称更改为“ testPing”和“ testPong”,并且按预期方式工作。另外,在GitHub上链接到此问题 https://github.com/socketio/socket.io/issues/2414关于socket.io中的“ pong”和“ ping”事件