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)

———————————————————————————</p>

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);
        }
)

全員とチャットする場合は、パブリック トピックに公開します

指定されたクライアントとチャットする場合は、プライベート トピックに公開します

———————————————————————————</p>

Q1: クライアントがサーバーを切断したときにサブスクライバーを更新する機能が必要です。connectionLost メソッドを追加しましたが、機能しません。パラメータ「理由」を出力すると、この関数が公開トピックと非公開トピックを同時に削除することがわかりました。しかし、プライベートトピックを削除する必要があるだけですよね? しかし、これを行う方法は?———————————————————————————</p>

Q2: clientX が退出した、または clientY がログインしたことを全員に通知するメッセージをブロードキャストするにはどうすればよいですか? この機能の実装方法がわかりません。

4

1 に答える 1

0

Q.1 ここでのアイデアは、接続されたすべてのクライアントを含む配列を作成することです。
どのように?単に登録/登録解除関数を作成し、各ユーザーが接続すると配列にエントリを追加し、切断すると配列からエントリを削除します。ユーザーに通知するには、登録関数では、このユーザーを追加する前にブロードキャスト関数 (以下で説明) を呼び出し、登録解除関数では、この配列からログアウトしたユーザーを削除した後、ブロードキャスト関数を呼び出します。

Q.2 (ブロードキャスト機能):これはかなり単純です。Websocket は双方向のユニキャストであるため、ブロードキャストの場合は、(上記で説明したように) 配列をループする関数を作成し、このループで各クライアントにメッセージを送信します。

于 2012-09-08T21:08:07.777 に答える