因此,如果使用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" }
等等......
答案 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
对象。每个都是用户的连接。