Javascript Socket.io会重复连接并忽略其他事件

Javascript Socket.io会重复连接并忽略其他事件,javascript,node.js,express,socket.io,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('publi

我正在尝试制作一个网络应用程序,用户可以在其中相互玩环形国际象棋。这是我的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是这个的主文件

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

<script src="js/board.js"></script>
var socket = io();
而且在移动验证功能中,无论何时进行有效移动,我都有一行

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


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

好的,看来您正在服务器上运行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版本以匹配。

上次我看到这种行为时,是因为socket.io的客户端和服务器版本不匹配。您在客户端和服务器上运行的socket.io版本是什么?你是如何加载客户端socket.io代码的?我对这些技术几乎一无所知,所以如果我说了一些难以置信的错误或愚蠢的话,请原谅。So@jfriend00当我在终端中键入“npm list socket.io”时,它会显示“toroidal@1.0.0/Users/Ryan/Desktop/Projects/Webapps/Toroidal└── 插座io@2.0.4,因此我假设这意味着我正在服务器端运行版本2.0.4。对于客户端socket.io,我有一行cdn.socket.io/socket.io-1.2.0.js“>,所以我在那里运行1.2.0版。这就是问题的根源吗?我使用它是因为我不知道如何直接从node_modules目录加载socket.io代码。哦,很有趣!我换上了你建议的线路,现在一切正常。谢谢非常感谢你,花半天的时间试图弄明白为什么我一直有6个客户端同时从1个用户连接,而没有其他任何客户端同时工作。如果你在我身边,我现在会吻你。我花了一整天的时间试图解决这个问题。。