【问题标题】:Socket.io keeps connecting repeatedly and ignores other eventsSocket.io 不断重复连接并忽略其他事件
【发布时间】:2018-06-12 16:05:36
【问题描述】:

我正在尝试制作一个 web 应用程序,用户可以在其中互相下环形国际象棋。这是我的 app.js,在服务器上:

var express = require('express');
var app = express();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var port = process.env.PORT || 8000;

app.use(express.static('public'));
app.get('/', function(req, res) {
  res.sendFile(__dirname + '/public/index.html');
  console.log("Got request for homepage");
});

io.on('connection', function(socket){
   console.log('A client has connected to the server');
   socket.on('move', function(moveString){
     console.log("Move made: " + moveString);
   });
  socket.on('disconnect', function(){
    console.log('A client has disconnected from the server');
  });
});

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

公共目录包含像 index.html 这样的文件,其中包含棋盘,以及一些控制棋盘并只允许合法移动的 javascript 和 CSS 文件。 board.js 是这个的主要文件。

在客户端,我的 index.html 文件包含以下行:

<script src="js/board.js"></script>

我的 board.js 文件包含以下行:

var socket = io();

并且在移动验证功能中,每当进行有效移动时,我都有这条线

socket.emit('move', moveString);

但是,每当我从终端运行 node app.js 然后在 Web 浏览器中访问 localhost:8000 时,终端每秒多次重复显示“客户端已连接到服务器”,如下所示:

Screenshot of terminal

此外,每当我从浏览器移动或移动到另一个页面时,服务器似乎没有注册这些事件(它没有记录“客户端已与服务器断开连接”,也没有记录已采取行动)。我做错了什么?

【问题讨论】:

  • 我最后一次看到这种行为是因为socket.io的客户端和服务器版本不匹配。您在客户端和服务器上运行什么版本的 socket.io?您如何加载客户端 socket.io 代码?
  • 我对这些技术几乎一无所知,所以如果我说了什么非常错误或愚蠢的话,请原谅。所以
  • @jfriend00 当我在终端输入“npm list socket.io”时,它显示“toroidal@1.0.0 /Users/Ryan/Desktop/Projects/Webapps/Toroidal └── socket.io @2.0.4",所以我认为这意味着我在服务器端运行版本 2.0.4。对于客户端 socket.io,我有
  • 直接来自 node_modules 目录。

标签: javascript node.js express socket.io


【解决方案1】:

好的,看来您正在服务器上运行 socket.io v2.0.4,在客户端运行 v1.2.0。像这样不匹配的版本号可能会导致您看到的行为实际上是无法正确连接,这会导致立即尝试重新连接并且它永远不会停止这样做。

您可以通过在客户端使用它直接从服务器获取正确的版本:

<script src="/socket.io/socket.io.js"></script>

socket.io 服务器有一个为/socket.io/socket.io.js 预先构建的路由处理程序,当该请求进入时,它将自动从 node_modules 目录中提供正确的匹配客户端版本。

如果您希望客户端来自 CDN,那么您需要获取与服务器版本完全匹配的 CDN 版本,并且无论何时升级服务器版本,您都必须修复 CDN 版本以匹配。

【讨论】:

  • 哦,有趣!我切换到您建议的线路,它现在按预期工作。谢谢!
  • 非常感谢,花了半天时间试图弄清楚为什么我一直有 1 个用户同时连接 6 个客户端,而没有其他任何东西同时工作。
  • 如果你在我身边,我现在就吻你。我花了一整天的时间来解决这个问题..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-01
  • 2021-01-28
  • 2013-08-01
  • 2018-01-28
  • 2016-05-24
  • 2019-01-19
  • 2012-05-28
相关资源
最近更新 更多