2016-06-07 93 views
0

因此,如果使用socket.io的示例,但將io.on函數放入app.get,則偵聽器將增加。我如何正確解決這個問題?我正在使用各種解決方案,但它們只是一種「膠帶」而不是一種正確的解決方案。 例如當頁面重新加載時,Socket.io監聽器會增加。節點js

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); 
      }); 
     } 
    }); 
} 

感謝和我的英語很抱歉。

Server代碼:

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" } 

等等......

回答

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處理程序。每一個都是用戶的連接。

+0

是的,但是如果我需要在'io'中獲得'req.session'。我如何在不使用'app.get/app.use'的情況下做到這一點? '函數dataInsert(REQ){ \t io.on( '連接',函數(插座){ \t \t \t socket.on( '數據',功能(數據){ \t \t \t \t data.toString() ; \t \t \t \t dataTasksInsert(req.session.user,數據); \t \t \t}); \t}); }' –

相關問題