Javascript Pusher一对一聊天结构

Javascript Pusher一对一聊天结构,javascript,websocket,pusher,facebook-chat,Javascript,Websocket,Pusher,Facebook Chat,我对Pusher平台中的状态频道有点困惑,因为我正在从头开始构建聊天应用程序。现在,我知道你们中的一些人已经看到了很多关于“实时聊天应用”的话题,但是,我要找的是点对点聊天,而不是网站范围内的全球聊天。更像是facebook聊天,你可以一对一地聊天 现在,我在PubNub的演示(名为Babel)中看到了一个示例,但是,这与我所寻找的相差甚远,因为我已经在控制台中检查了请求,即使没有显示,其他用户之间发送的消息也显示在我的网络请求日志中,因为它在JS中被过滤,而不是服务器端,这不是我想要的 那么,

我对Pusher平台中的
状态频道有点困惑,因为我正在从头开始构建聊天应用程序。现在,我知道你们中的一些人已经看到了很多关于“实时聊天应用”的话题,但是,我要找的是点对点聊天,而不是网站范围内的全球聊天。更像是facebook聊天,你可以一对一地聊天

现在,我在PubNub的演示(名为Babel)中看到了一个示例,但是,这与我所寻找的相差甚远,因为我已经在控制台中检查了请求,即使没有显示,其他用户之间发送的消息也显示在我的网络请求日志中,因为它在JS中被过滤,而不是服务器端,这不是我想要的

那么,回到主题上来, 我知道频道/专用频道/状态频道的功能,我决定这样做:

  • 打开应用程序时,每个用户都会订阅自己的
    private-user\u id
    频道(如果频道不存在,则创建)

  • 同时(打开应用程序时)
    user1
    订阅一个
    presence-global
    频道,如果朋友在线,其他人可以在该频道中跟踪

  • 当其他人想要向他发送消息时,例如,
    user2
    user1
    ,他订阅
    private-1
    ,此后javascript将处理事件

我知道这有点不对劲因为。。如果
user3
将向
user1
发送消息,他会订阅
private-user1
,因此我猜他也会看到
user2
在向
user1
发送消息时触发的事件,对吗?还是我弄错了

我在他们的文档中读到,
presence
频道实际上是一个
private
频道扩展,所以我现在想。。为什么不再使用
私人频道
,然后,我如何通知所有朋友我在线

但是,在他们的文档中出现了另一个问题,告诉我
频道提供了两个重要的东西(除其他外),第一个是
过滤数据的方法
,第二个是
控制访问的方法

既然他们的文档中没有链接,我该如何“过滤数据”,或者更好,一对一聊天你有什么想法。很抱歉,如果我把他们所有的文档都弄错了,我看了他们的示例应用程序,但是没有一个使用我正在寻找的一对一技术

我不熟悉推送和套接字连接等,但我已经学会了如何进行身份验证,如何创建、检测和处理频道中的事件,我可以与在线成员创建一个简单的全局聊天,但是,当涉及到私人频道时,我对如何为两个用户创建单独的频道感到非常困惑

提前谢谢

的目的是限制谁可以订阅该频道。因此,您可以:

  • 使用它可以确保只有用户朋友才能订阅更新
  • 仅将其用于该用户的通知
  • 在一对一的聊天中,我建议你选择后者(第2位)

    考虑到这一点,我开始实现一对一的聊天,如下所示:

    var notifications = pusher.subscribe( 'private-notifications-user_one' );
    var forum = pusher.subscribe( 'presence-forum' );
    
    论坛 当用户加入聊天应用程序时,他们都会订阅两个频道:

  • private notifications-
    其中
    user\u id
    是他们唯一的用户id,例如在我的例子中是
    leggetter
    。此频道用于用户特定的通知
  • 状态论坛
    适用于该论坛中的所有用户。这个问题称之为全球存在
  • 这是通过以下方式实现的:

    var notifications = pusher.subscribe( 'private-notifications-user_one' );
    var forum = pusher.subscribe( 'presence-forum' );
    
    订阅每个频道后,将进行该过程

    在论坛内,您可以通过发送和接收消息在
    状态论坛
    /
    状态全局
    上进行一般公共聊天

    开始一对一的聊天 当一个用户(
    user\u one
    )想要与另一个用户(
    user\u two
    )进行私人聊天时,您显然需要UI中的某些内容来触发此操作。说
    user\u one
    点击
    user\u two
    旁边的内容,表示他们想要一对一的聊天。发生这种情况时,应向服务器(机构)发出请求,指示
    user\u one
    想要启动与
    user\u two
    †的私人聊天

    注:†如果您为一对一聊天选择了频道命名约定,则专用频道身份验证实际上可以用作专用一对一聊天启动

    当服务器收到此请求时,它可以为此一对一聊天生成唯一的专用频道名称。一种非常简单的方法是连接用户ID,例如,
    私人聊天--
    (还有其他注意事项,例如,您可能希望确保两个用户之间的频道名称始终相同)。在我们的简单场景中,频道名称将是
    private-chat-user\u one-user\u two

    然后,服务器可以在专用通知频道上为每个在有效负载中提供一对一专用聊天频道名称的用户触发一对一聊天请求事件

    // Trigger event on both user channels with one call
    var channels = [ 'private-notifications-user_one', 'private-notifications-user_two' ];
    // Additional event data could also be sent
    // e.g. more info on the initiating user
    var eventData = {
                      'channel_name': 'private-chat-user_one-user_two',
                      'initiated_by': 'user_one'
                      'chat_with'   : 'user_two'
                    };
    pusher.trigger( channels, 'one-to-one-chat-request', eventData );
    
    user\u one
    接收到
    one-to-one聊天请求时
    他们将订阅
    eventData.channel\u name
    channel,并将为该频道进行聊天

    // A lookup of private chats
    // where the key is the user ID of the current user is chatting with
    var privateChats = {};
    notifications.bind( 'one-to-one-chat-request', function( data ) {
    
      // MY_USER_ID would need to be stored somewhere
      // and in this case the value would be 'user_one'.
      // expectingChatWith should make sure user_one is waiting for
      // a private chat response with the given user
      if( data.initiated_by === MY_USER_ID &&
          expectingChatWith( data.chat_with ) ) {
        startPrivateChat( data.chat_with, data.channel_name );
      }
    
    } );
    
    function startPrivateChat( withUserId, channelName ) {
      privateChats[ withUserId ] = pusher.subscribe( channelName );
    }
    
    var privateChats = {};
    notifications.bind( 'one-to-one-chat-request', function( data ) {
    
      if( ... ) { ... }
      // has somebody request to chat with this user?
      else if( data.chatWith === MY_USER_ID ) {
        // Prompt the user
        // Note: more user info required
        displayChatPrompt( data );
      }
    
    } );
    
    // callback when the user accepts the chat request
    function accepted( chatUserId, channelName ) {
      startPrivateChat( chatUserId, channelName );
    }
    
    // the user doesn't want to chat
    function declined( chatUserId ) {
      // send info to the server indicating declined request
    }
    
    user\u two
    收到
    one-to-one聊天请求时
    需要通知用户该请求,然后接受或拒绝该请求。如果用户接受,那么客户端代码只是订阅通道。如果用户拒绝,则应向服务器发送请求,并在
    private-notifications-user_one
    上触发一个事件,告知他们的一对一聊天请求被拒绝。这将允许
    user\u one
    取消私人聊天频道的订阅