Socket.io 不断重复连接并忽略其他事件

Zan*_*nik 4 javascript node.js express socket.io

我正在尝试制作一个网络应用程序,用户可以在其中相互下棋。这是我的 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);
});
Run Code Online (Sandbox Code Playgroud)

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

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

<script src="js/board.js"></script>
Run Code Online (Sandbox Code Playgroud)

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

var socket = io();
Run Code Online (Sandbox Code Playgroud)

并且在移动验证功能中,只要进行了有效的移动,我就有了这条线

socket.emit('move', moveString);
Run Code Online (Sandbox Code Playgroud)

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

终端截图

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

jfr*_*d00 14

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

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

<script src="/socket.io/socket.io.js"></script>
Run Code Online (Sandbox Code Playgroud)

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

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