Python 使用sockjs tornado的私有消息传递

Python 使用sockjs tornado的私有消息传递,python,django,python-3.x,tornado,sockjs-tornado,Python,Django,Python 3.x,Tornado,Sockjs Tornado,我已经使用sockjs tornado实现了聊天功能,可以将消息存储在数据库中 你能帮助我在sockjs tornado中如何建立消息的专用通道吗?(我指的是私人谈话/一对一) 下面是我的服务器端代码中的on_message函数- def on_message(self, message): str=message mg=str.split('#:#') sender=1 # This is the sender user id receiver=2 #This

我已经使用sockjs tornado实现了聊天功能,可以将消息存储在数据库中

你能帮助我在sockjs tornado中如何建立消息的专用通道吗?(我指的是私人谈话/一对一)

下面是我的服务器端代码中的on_message函数-

def on_message(self, message):
    str=message
    mg=str.split('#:#')
    sender=1 # This is the sender user id
    receiver=2 #This is the receiver user id - I need to implement session variables to have these id's so that I can use it here this way
    ts=r.expr(datetime.now(r.make_timezone('00:00')))
    connection = r.connect(host="192.x.x.x")
    r.db("djrechat").table('events').insert({"usrs":mg[0],"msg":mg[1],"tstamp":ts,"snder":sender,"rcver":receiver}).run(connection)
    log.info(message)
    self.broadcast(self.participants, '{} - {}'.format(self.stamp(),message))
目前,这是广播到所有连接的客户端。 可能我应该有一个通道id,并且只向两个具有相同通道id的客户端发送消息,但是我如何实现它,或者有更好的解决方案吗

在客户端,我有以下javascript-

      function connect() {
        disconnect();
        conn = new SockJS('http://localhost:8080/chat', ['websocket','xhr-streaming','iframe-eventsource','iframe-htmlfile','xhr-polling','iframe-xhr-polling','jsonp-polling']);
        //log('Connecting.....');
        conn.onopen = function() {
        //  log('Connected. (' + conn.protocol + ')');
        log('Connected.');
        };

        conn.onmessage = function(e) {
          log(e.data);
        };

        conn.onclose = function() {
          log('Disconnected.');
          conn = null;
        };
      }

我正在使用Python3.4-Django 1.8.4和RejectionDB

虽然sockjs tornado没有实现像通道和房间这样的东西,但是有人可以实现它。再看看。解决方案基于结构化的
msg
-在消息中发送其他信息-频道名称。

我的回答假设当前解决方案中的所有客户端都使用用于广播聊天消息的频道名称(或类似于此场景的名称)连接到SockJS服务器。我进一步假设,当用户从客户端发送消息时,往返行程为:

[Sender (Client)] ------- Message (POST) --> [App Server] --- Message --> [Database]
                                                  |
                                               Message
                                                  v
[Receiver(s) (Client)] <-- Message (WS) -- [SockJS Server]
[发送者(客户端)]----消息(POST)-->[应用服务器]----消息-->[数据库]
|
消息
v

[Receiver(s)(Client)]我尝试使用conn.send({'method':'set channel','data':{'channel':channel_id}),channel_id是客户端我的onopen事件中的'senderid和receiverid'的组合。。但它失败了,我在控制台中没有看到任何错误。。我不知道如何实现一对一的信息检查房间示例,如果它有帮助的话,感谢示例!非常感谢Martin分享有用的信息!我将尝试调整我之前想到的第一个,但不确定如何使我的服务器通过专用通道识别传入的消息,并将消息仅推送到专用通道客户端。。我将尝试实现。嗨,马丁,你能帮我处理私人消息代码吗?我尝试了不同的方法,但无法实现一对一的消息传递。基于RabbitMQ的也很好。。唯一的问题是它应该是python 3.4supported@Sathish,您是否已开始使用RabbitMQ并在后端使用Web STOMP,如我上面建议的那样?因为如果是这样的话,自RabbitMQ版本3.5.7(或者更好的版本3.6.0)以来,实现私有通道变得更加容易。知道这一点将有助于我编写伪代码。