【问题标题】:Setting up a socket.io room for a specific group based on url. Node.js, Express, Angluarjs根据 url 为特定组设置 socket.io 房间。 Node.js、Express、Angluarjs
【发布时间】:2014-09-07 12:17:10
【问题描述】:

我有一个使用 express、angular、mongodb 和 socket.io 在用户属于组的节点上运行的 Web 应用程序。在这些组中,我需要设置一个聊天套接字,只有属于该组的人才能看到特定于该组的消息,并且只向该组中的其他用户发送消息。目前,我已经设法根据他们网站上的指南设置了 socket.io 聊天室,但发送的消息对所有其他组都是可见的。我读到我需要设置某些房间,但我不知道如何设置它以使房间特定于该组。

组在域中:例如... www.mydomain.com/groups/groupId/room

groupId 是由 MongoDB 生成的唯一 ID。我在客户端使用 Angularjs,并且有一个组控制器。如果有人对如何实现这一点有任何想法或可以指出正确的方向,我将不胜感激。

我当前的服务器端代码:

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

io.sockets.on('connection', function(socket) {

    socket.on('connectToServer', function (data) {
        var name = data.name;
        io.sockets.emit('user-join', name + " has connected to the group");
    });

    socket.on('send msg', function (data) {
        io.sockets.emit('get msg', data);
    });

});

以及我在 groupController 中的客户端代码,其中我访问了一个存储当前用户详细信息的全局服务,如下所示:

var socket = io.connect();

$scope.msgs = [];

$scope.sendMsg = function () {
    socket.emit('send msg', $scope.msg.text);
    $scope.msg.text = "";
}

socket.on('get msg', function (data){
    $scope.msgs.push(data);
});

var currentUser = Global.currentUser();
var name = currentUser.username;

socket.emit('connectToServer', {name: name});

socket.on('user-join', function (data) {
    $scope.msgs.push(data);
});

【问题讨论】:

标签: node.js express socket.io


【解决方案1】:

我建议为您聊天的每个房间设置命名空间。我在自己的代码中做了类似的事情。注意:在 socket.io 本身中,房间和命名空间有点不同(socket.io 两者都有:http://socket.io/docs/rooms-and-namespaces/)。

在服务器代码中:

我在socket.on('connection')下有一个方法,类似于

socket.on('groupConnect', function(group){
    var groupNsp = io.of('/' + group);
}

这实质上确保命名空间存在于所需命名空间的名称下。再次调用时不会弄乱或重置命名空间。

然后用于接收消息:

socket.on('message', function(data){
    var msg = data.msg;
    var nsp = data.nsp;
    io.of(nsp).emit('message', msg);
}

您也可以将 nsp 添加到您已有的数据中,然后再次将数据发送给客户端。

然后,在客户端代码中:

var socketOut = io.connect('http://yourdomain:1337/');
var someGroupOrMethodToGetGroup;
socketOut.emit('groupConnect', someGroupOrMethodToGetGroup);
var nsp;
setTimeout(function(){
    socket = io.connect('http://yourdomain:1377/' + someGroupOrMethodToGetGroup);
    socket.on('message', function(msg){
        displayMessage(msg);
    }
    nsp = '/' + someGroupOrMethodToGetGroup;
}, 1500);

然后在我的 displayMessage 代码中我有:

socketOut.emit('message', { msg: desiredMessage, nsp: nsp });

【讨论】:

  • 这应该对您有用,只需更改变量以适合您预先存在的代码。祝您聊天愉快!
  • 终于有时间尝试实现这个了。非常感谢,这工作得很好。非常感谢您的帮助。
  • 没问题。祝您的 Web 应用程序好运。
  • 我遇到的另一个问题,我需要能够通过按钮断开与套接字的连接。如果我在单击时调用一个函数,例如: function onClick() { socketOut.disconnect(); } 在客户端,然后登录到服务器端的控制台“用户已断开连接”这是可行的,但是套接字数组下命名空间上的套接字 id 没有被清除,如果你退出窗口,那么它会记录消息并清除套接字数组。不知道为什么这不起作用。服务端代码为:socket.on('disconnect', function() { console.log('user disconnected')} );
  • 请确认我理解正确。您可以从全局套接字断开连接,但不能从命名空间套接字断开连接?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-08
  • 2013-10-10
  • 2018-05-07
  • 2017-10-20
  • 2014-07-29
  • 1970-01-01
  • 2014-10-20
相关资源
最近更新 更多