簡體   English   中英

Socket.io - io.to.emit向所有連接的用戶發出

[英]Socket.io - io.to.emit emits to all connected users

我有一個MEAN應用程序設置與npm socket.io與客戶端上的expressjs和btford.socket-io

angular.module('myApp',['btford.socket-io'])
    .factory('socket',function(socketFactory){
       return socketFactory();
    }
).controller('myAppCtrl',['$scope','socket',
    function(a,b){
            b.on('test',function(data){
            console.log(data);
        });
    } 
]);

這是node-express設置:

var app = express(),
    server = app.listen(3000);

var socket = require('socket.io'),
    io = socket.listen(server);

require('/config/routes/index.js')(app,io);
require('/config/routes/test.js')(app,io);

路由:(config / routes / index.js)

module.exports = function(app,io){
    app.get('/',function(req,res){
        io.on('connection',function(socket){
            socket.join(req.session._id);
        });
        res.render('index');
    });
};

配置/路由/ test.js

module.exports = function(app,io){
    app.get('/route1',function(req,res){
        io.to(req.session._id).emit('test',{
            data : 'Works'
        });
        res.render('route1');
    });  
};

A)每當用戶轉到route1時,將觸發emit事件並將其發送給所有用戶。

B)是否有更好的方法來避免為每個用戶使用獨特的空間? 這不是聊天應用程序,而是實現推送通知

您需要將socket.io中的連接與請求分開考慮。 它們並不像你認為的那樣捆綁在一起。 您的連接偵聽器用於任何連接,而不僅僅是與給定請求相關的連接......您嘗試執行的操作不會以這種方式工作。

想象一下,項目的socket.io部分與應用程序的web / express部分中的http請求完全分開。 這就是你應該如何看待傳遞消息。

另外值得考慮的是,如果使用群集或類似的縮放方法,則一個實例中的默認socket.io設置不會與其他實例通信。

關於套接字和請求如何工作,你有幾個主要的誤解。 它們是非常獨立的操作,並且不像您認為的那樣連接。 我將嘗試解釋您的代碼的問題。

在這段代碼中:

module.exports = function(app,io){
    app.get('/',function(req,res){
        io.on('connection',function(socket){
            socket.join(req.session._id);
        });
        res.render('index');
    });
};

您正在處理/頁面請求,每一次該請求被擊中,您添加另一個事件處理程序io.on('connection', ...)所以你可以有很多的那些。

此外,如果連接事件發生之前用戶點擊/頁,那么你將完全錯過和插座不會被放置到合適的聊天室。


然后,在這段代碼中:

module.exports = function(app,io){
    app.get('/route1',function(req,res){
        io.to(req.session._id).emit('test',{
            data : 'Works'
        });
        res.render('route1');
    });  
};

io.to()需要一個字符串,是一個聊天室的名稱。 因此,這將消息發送到每一個插座是在req.session._id聊天室。 對於這個工作,你必須絕對確保req.session._id是完全獨特的這個用戶,而且所需的用戶已經通過這個名字加入了一個聊天室。 這可能有效,但這取決於那些具體的事情是否正確。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM