【问题标题】:Socket io keeps console logging user connected version 2.x.xSocket io 保持控制台记录用户连接版本 2.x.x
【发布时间】:2018-02-19 17:37:16
【问题描述】:

我有一个来自 socket.io 官方网站的基本节点 express/socket 示例应用程序(链接粘贴在下面),我注意到当用户连接时,“连接”甚至只是一遍又一遍地触发。

所以我发现一个帖子 (Socket IO chat repeating user connected) 说 socket.io 2.xx 中存在一个错误,当我恢复到 socket.io 1.3.7 时,这个问题确实停止了,这是一个已确认的错误,我们应该回滚到 1.xx 版本吗?还是有没有反映在当前文档中的使用 socket.io 的新方法?

我的服务器代码:

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

app.get('/', function(req, res){
  res.sendFile(__dirname + '/index.html');
});

io.on('connection', function(socket){
  console.log('a user connected');
});

http.listen(3000, function(){
  console.log('listening on *:3000');
});

我的客户端代码:

<script src="/socket.io/socket.io.js"></script>
<script>
  var socket = io();
</script>

我的服务器终端输出(永远重复):

a user connected
a user connected
a user connected
...

Socket.io 官方示例: https://socket.io/get-started/chat/

【问题讨论】:

  • 可能是&lt;script src="/socket.io/socket.io.js"&gt;&lt;/script&gt; 的问题,因为我刚刚在我的PC 中使用Socket IO v2.0.4 运行了这个示例,而user connected 没有重复
  • 永远重复连接一般是由于socket.io的客户端和服务器版本不匹配造成的。我想知道您是否会遇到旧版本的/socket.io/socket.io.js 浏览器缓存问题?
  • @jfriend00 是的,我相信就是这样。客户端与服务器版本控制不匹配。我不知道为什么路径在下面的答案中很重要,但如果你想提交答案,我会给它加星标。

标签: node.js socket.io


【解决方案1】:

自从 socket.io 发布 2.x 版以来,如果客户端和服务器上的 socket.io 代码版本不匹配,似乎会导致无限重复连接、断开连接、连接、断开连接等等。

客户端缓存会进一步加剧这种情况,有时会使浏览器客户端卡在旧版本上。

通常的解决方法是确保您使用/socket.io/socket.io.js 获取socket.io 客户端,因为这样socket.io 服务器会发送与其完全匹配的客户端版本。但是,你似乎已经这样做了,所以我猜你有某种浏览器缓存问题。您可以手动清除浏览器缓存,看看是否是问题所在。

【讨论】:

    【解决方案2】:

    将此用于服务器:

    var express = require('express');    
    var app = require('express')();
    var http = require('http').Server(app);
    var io = require('socket.io')(http);
    app.use(express.static('node_modules')); // serve static files
    app.get('/', function(req, res){
      res.sendFile(__dirname + '/index.html');
    });
    
    io.on('connection', function(socket){
      console.log('a user connected');
    });
    
    http.listen(3000, function(){
      console.log('listening on *:3000');
    });
    

    这在 HTML 中:

    <!DOCTYPE html>
    <html lang="en">
    <body>
        <script src="socket.io-client/dist/socket.io.js"></script>
        <script>
            var socket = io();
        </script>
    </body>
    </html>
    

    该错误可能与 Socket IO 提供的 &lt;script src="/socket.io/socket.io.js"&gt;&lt;/script&gt; 标记有关。

    【讨论】:

    • 为什么这能解决问题?而且,你为什么盲目地想用express.static() 提供对整个node_modules 层次结构的访问?我看不出这是一个好的解决方案。
    • 仅假设 SocketIO 服务的客户端有问题。整个 'node_modules' 只是为了获取 socket.io-client 脚本。正如正确所说,不应该在生产中使用。
    • 好的。我认为脚本标签可能是罪魁祸首。可能没有
    • socket.io 支持该脚本标签。它会自动为/socket.io/socket.io.js 添加路由。
    • 是的。我看不到可能发生的任何其他问题。所以建议直接从包中获取客户端。
    猜你喜欢
    • 2020-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    相关资源
    最近更新 更多