【发布时间】:2018-04-28 01:30:42
【问题描述】:
我从 socket.io 开始创建了一个简单的应用程序,但是当我运行它时,Chrome(在其他浏览器中测试,结果相同)占用了我所有的 CPU 并发出许多请求:
我是套接字的新手,但我确信这不是它应该如何工作的。在浏览器中运行的代码非常简单,它应该只是连接到套接字并将所有接收到的数据记录到控制台:
index.html
<!DOCTYPE html>
<html>
<head>
<script src="https://cdn.socket.io/socket.io-1.2.0.js" charset="UTF-8"></script>
</head>
<body>
<script type="application/javascript">
var Sockets = io.connect('http://localhost:4000');
Sockets.on('Test', function (data) {
console.log(data);
});
</script>
</body>
</html>
另外,我的服务器文件如下所示:
server.js
var app = require('express')();
var http = require('http').Server(app);
var bodyParser = require("body-parser");
var io = require('socket.io')(http);
var port = 4000;
http.listen(port, function () {
console.log('Server running at port ' + port);
});
var urlencodedParser = bodyParser.urlencoded({extended: false});
app.post('/', urlencodedParser, function (req, res) {
if (!req.body) return res.sendStatus(400);
var post = req.body;
io.emit("Test", post.data);
console.log(post.data);
res.send('true');
});
io.on('connection', function(socket){
console.log('a user connected');
socket.on('disconnect', function(){
console.log('user disconnected');
});
});
当我运行服务器 node server.js 时,我收到了 Server running at port 4000 消息,一切似乎都很好。但是当我在浏览器中打开 index.html 时,节点控制台会被a user connected 消息发送垃圾邮件。浏览器不是连接一个客户端,而是每秒发出几十个请求。当我关闭浏览器时,有一段时间没有输出,然后节点控制台被user disconnected消息发送垃圾邮件。
此服务器应将所有通过 POST 发送的数据重定向到连接的套接字。当我发出这个 POST 请求时,节点服务器会收到它(我知道是因为它会打印到节点控制台中)。但是socket客户端没有接收到,因为浏览器控制台没有输出(但是浏览器仍然每秒建立几十个新连接。
这里有什么问题?首先我以为我搞砸了,所以我返回并从tutorial I found 复制粘贴代码(不是英语,而是捷克语),但没有任何改变。该教程有很多积极的反馈,所以我的电脑可能有问题。但是什么?
【问题讨论】:
-
当您说“在我的浏览器中打开 index.html”时,究竟是什么意思?你是直接从文件系统打开吗?您应该通过 Web 服务器打开它,而不是通过文件系统。由于 socket.io 的连接方式,如果 Web 服务器上没有 CORS 配置,它将无法正常工作到跨域服务器。如果您从文件系统打开 index.html,
http://locahost:4000将是一个跨源端点,并且不会让您正确连接。 -
@jfriend00 我在 PhpStorm 中使用“运行”按钮。正如您在屏幕截图中看到的,url 是 localhost:phpstorm'sport/somepath/index.html
-
“运行”按钮的实际作用是什么?我再问一次。
index.html是从文件系统还是从您的 Web 服务器加载的?它需要从您的 Web 服务器加载。仅供参考,您的网络服务器代码没有显示任何服务 index.html 的方式,所以我怀疑您是从文件系统加载它,这是错误的,也是问题的原因。 -
@jfriend00 PhpStorm 中的“运行”按钮启动 PhpStorm 中的内部网络服务器。我可以通过输入我在 PhpStorm 中配置的端口的计算机 IP 从局域网中的其他计算机访问该页面,因此必须有一个网络服务器。
标签: javascript node.js sockets