如何在Autobahn Wamp协议中获取客户端IP地址?

2 投票
1 回答
1564 浏览
提问于 2025-04-18 11:44

我在用Autobahn Wamp这个工具在Python中建立socket连接。我使用的是PubSub机制来建立连接,连接已经成功建立。

但是我找不到办法来维护一个和服务器连接的客户端列表。

请问有没有人能建议我一个方法,让我可以维护一个连接客户端的IP地址列表,并且能通过这些地址给特定的客户端发送回复?

希望能尽快收到回复。

提前谢谢大家!

1 个回答

1

这个问题分成两部分。第一部分是问如何找到连接的网络套接字的IP地址。第二部分是问如何把消息发送给特定的会话。

我先从第二部分开始。在上面的评论中,有一个工厂变量。这个变量可以在它的作用范围内随处使用,像这样:

factory.dispatch("http://domain.com/topic", "payload", [ excluded sessions ], [ included sessions])

会话ID看起来像这样:TB15LhO8oS0MLsj6,它可以在协议的方法中使用,比如onSessionOpen、onClose,存储在self.session_id变量里。我通常会这样做:

ses_var = {} 

把这个放在你代码的顶部,作为一个全局变量。然后,在onSessionOpen()方法中:

def onSessionOpen(self):
    global ses_var

    ses_var[self.session_id] = self
    print "connection from ", self.peer.host, self.peer.port

这段代码让你可以获取会话的句柄。你需要管理这个变量,并在onClose()方法中把会话从变量中移除。

所以,如果你把所有打开的会话都保存在ses_var变量中,那么你可以使用dispatch给任何(或所有)会话发送消息,像这样:

    factory.dispatch("http://domain.com/topic", "payload", [],
      factory.sessionIdsToProtos(ses_var.keys()))

注意,session_id并不是预期的参数,你需要把ID转换成实际的会话对象。

factory.dispatch中的两个数组定义了不发送消息给谁,以及发送消息给谁。如果你把第二个数组设置为None,那么你就会把消息发送给所有客户端,所以这个示例的dispatch可以改写为:

    factory.dispatch("http://domain.com/topic", "payload", [], None)

如果你想把消息发送给第一个会话(比如说),你可以这样做:

    factory.dispatch("http://domain.com/topic", "payload", [],
         factory.sessionIdsToProtos([ses_var[0].session_id]))

撰写回答