我正在使用Autobahn Wamp在Python中进行套接字连接。我正在使用PubSub机制建立连接。连接成功建立。
但是我找不到一种方法来维护与服务器连接的客户端列表。
请问有人可以提出一种方法,帮助我维护所连接客户端的IP地址列表,以及如何使用各自的地址向特定客户端发送回复的方法吗?
请尽早回复。
提前致谢
最佳答案
这是一个两部分的问题。第一部分是询问如何识别连接的Web套接字的IP地址。第二部分是询问如何将消息定向到特定会话。
我将从第二部分开始。在上面的注释中,有一个工厂变量。可以在如下范围内的任何地方使用:
factory.dispatch("http://domain.com/topic", "payload", [ excluded sessions ], [ included sessions])
会话ID看起来像这个TB15LhO8oS0MLsj6,并且可用于协议中的方法,例如self.session_id变量中的onSessionOpen,onClose。我做这样的事情:
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变量中的所有打开的会话,则可以再次使用分派将消息发布到其中的任何(和所有)消息:
factory.dispatch("http://domain.com/topic", "payload", [],
factory.sessionIdsToProtos(ses_var.keys()))
请注意,session_id不是预期的参数,您必须将id转换为实际的会话对象。
factory.dispatch中的两个数组定义不向谁发送消息以及向谁发送消息。如果将None作为第二个数组传递,则将向所有客户端发送一条消息,因此该示例的分派可以重写为:
factory.dispatch("http://domain.com/topic", "payload", [], None)
例如,如果要将其发送到第一个会话,则可以执行以下操作:
factory.dispatch("http://domain.com/topic", "payload", [],
factory.sessionIdsToProtos([ses_var[0].session_id]))