【问题标题】:how can I make private chat rooms with sockjs?如何使用 sockjs 制作私人聊天室?
【发布时间】:2014-07-19 02:58:44
【问题描述】:

我正在尝试制作一个聊天系统,一次只能让两个用户互相交谈(很像 facebook 的聊天)

我尝试过多路复用,使用 mongoDB 的 _id 作为名称,因此每个通道都是唯一的。

我面临的问题是我无法将消息定向到单个客户端连接。

这是首先发送消息的客户端代码

$scope.sendMessage = function() {
  specificChannel.send(message)
  $scope.messageText = '';
};

这是接收消息的服务器端

specificChannel.on('connection', function (conn) {
  conn.on('data', function(message){
    conn.write('message') 
  }
}

当我向任何频道发送消息时,每个频道仍会收到该消息。

如何让每个客户端只监听发送到特定频道的消息?

【问题讨论】:

    标签: node.js websocket socket.io sockjs multiplexing


    【解决方案1】:

    SockJS 似乎不支持“私人”频道。对于类似的问题,我使用了以下解决方案:

    var channel_id = 'my-very-private-channel'
    var connection = new SockJS('/pubsub', '')
    
    connection.onopen = function(){
        connection.send({'method': 'set-channel', 'data': {'channel': channel_id}})
    }
    

    后端解决方案特定于每个技术堆栈,因此我无法在此给出通用解决方案。大致思路如下:

    1) 解析“on_message”函数中的消息,找到请求的“方法名”

    2) 如果方法是“set-channel” -> 将“self.channel”设置为这个值

    3) 向同一频道的订阅者广播更多消息(我为此使用 Redis,但这也取决于您的平台)

    希望对你有帮助!

    【讨论】:

    • 这实际上与我最终所做的非常相似 =)。我基本上发出了一个具有唯一通道 ID 的事件(例如 socket.emit(Channel_ID, message) ),并且只有属于通道的客户端才会监听该事件。我已经解决了这个问题,但感谢您的回答=)
    • 嗨,Dmitry,我也尝试过这样做,connection.send() 函数失败,我看到浏览器控制台中没有记录错误。你能帮我stackoverflow.com/questions/34461046/… 吗?跨度>
    猜你喜欢
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 2013-03-11
    相关资源
    最近更新 更多