2012-08-24 46 views
1
class MyServerProtocol(WampServerProtocol): 

    @exportRpc 
    def getSubscribers(self): 
     print "call getSubscribers" 

     subscriptions = [] 
     for key, value in enumerate(self.factory.subscriptions): 
      subscriptions.append(value) 
     return json.dumps(subscriptions) 

    def onSessionOpen(self): 
     print "someone has logined" 

     self.registerForPubSub("http://example.com/event/", True) 

     self.registerMethodForRpc("http://example.com/event/getSubscribers", 
      self, 
      MyServerProtocol.getSubscribers) 


    def connectionLost(self, reason): 
     print "someone disconnect", reason 

     self.factory._unsubscribeClient(self) 
     self.factory._removeSession(self) 

     WampProtocol.connectionLost(self, reason) 
     WebSocketServerProtocol.connectionLost(self, reason) 

----------------------------如何在客户端断开连接时删除订阅?

ab.connect(chat.wsuri, 
     function (session) { 
      sess = session; 

      sess.prefix("event", chat.prefix); 
      sess.subscribe("event:" + chat.channel, chat.subscribeSuccess); //public topic, subscribe a common topic 
      sess.subscribe("event:" + chat.username, chat.subscribeSuccess);//privite topic, subscribe myself topic 

      chat.stateUpdate(true); 

     }, 

     function (code, reason) { 
      sess = null; 
      alert(reason); 
      chat.stateUpdate(false); 
     } 
) 

如果聊天给大家,发布到公共话题

如果聊天指定的客户端,发布到privite话题

----------------------------

Q1 : 我需要一个功能,当客户端断开服务器时,更新订户。 我添加connectionLost方法,但它不起作用。 我打印参数“reason”,我发现这个函数同时删除public和privite主题。 但我只需要删除privite主题,我是对不对?但是,如何做到这一点? ----------------------------

问题二:如何广播一条消息告诉大家,clientX已经离开或clientY有logined? 我不知道如何实现这个功能。

回答

0

Q.1这里的想法是创建一个数组,其中包含所有连接的客户端。
如何?只需注册/取消注册功能,当每个用户连接时,在数组中添加条目,当断开连接时从数组中删除条目。现在通知用户,在注册函数中,在添加此用户之前,调用广播函数(如下所述)并在从此阵列中移除注销用户后取消注册函数,调用广播函数。

Q.2(广播功能):这很简单。由于websockets是单播双向的,所以对于广播来说,在循环数组(如上所述)的情况下创建一个函数,并在此循环中向每个客户端发送消息。

相关问题