Socket.io反复连接并忽略其他事件

时间:2018-01-03 00:22:55

标签: javascript node.js express socket.io

我正在尝试制作一个用户可以互相玩象棋的webapp。这是我的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);

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

Screenshot of terminal

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

1 个答案:

答案 0 :(得分:3)

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

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

style="backgroud:url(img path) no-repeat"

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

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