页面重新加载时Socket.io侦听器会增加。节点js

时间:2016-06-07 00:59:47

标签: javascript node.js express socket.io

因此,如果使用socket.io中的示例,但将io.on函数放入app.get,则会增加侦听器。我该如何正确解决这个问题?我使用的是各种各样的解决方案,但它们更像是一种胶带"比正确的解决方案。 例如

socket.removeAllListeners();

function socketio() {
    var counter = 1;
    io.on('connection', function (socket) {
        if (!(counter)) {
            counter--;
            socket.emit('news', {hello: 'world'}, function () {
            });
            socket.on('my other event', function (data) {
                console.log(data);
            });
        }
    });
}

谢谢,对不起我的英语。

服务器代码:

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

server.listen(80);

app.use(express.static(__dirname + '/public'));

function socketio() {
    io.on('connection', function (socket) {
        socket.emit('news', {hello: 'world'}, function () {
        });
        socket.on('my other event', function (data) {
            console.log(data);
        });
    });
}
app.get('/', function (req, res) {
    socketio();
    res.render('socket.jade');
});

客户端代码

var socket = io.connect('http://localhost');
socket.on('news', function (data) {
    console.log(data);
    socket.emit('my other event', { my: 'data' }, function(){
    });
});

首页重新加载后

Server console.log
{ my: 'data' }

Client console.log
Object { hello: "world" }

第二次重装

Server console.log

{ my: 'data' }
{ my: 'data' }
{ my: 'data' }
{ my: 'data' }

Client console.log
Object { hello: "world" }
Object { hello: "world" }

等等......

1 个答案:

答案 0 :(得分:0)

这是因为每次加载路由处理程序时,都要告诉socket.io再次添加事件侦听器。 socket.io在单独的通道上侦听websocket连接,因此您只需运行io.on('connection' ...一次。试试这个:

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

server.listen(80);

app.use(express.static(__dirname + '/public'));

io.on('connection', function (socket) {
    socket.emit('news', {hello: 'world'}, function () {
    });
    socket.on('my other event', function (data) {
        console.log(data);
    });
});

app.get('/', function (req, res) {
    res.render('socket.jade');
});

如果您需要处理特定用户的websocket连接,则应管理来自socket处理程序的各个connection对象。每个都是用户的连接。