如何在Autobahn Wamp协议中获取客户端IP地址?
我在用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]))