1

Ratchet WAMP + アウトバーン バージョン 1 のチャット ハロー ワールドを作成しました。
見たい場合は、ここで完全なソース コードを確認してください。

JavaScript クライアントがチャット メッセージを送信します。

           function click_send_btn() {
                 var json_data = {
                    "message": $.trim($("#input_message").val())
                 };
            sess.publish("send_message", json_data, true);
            }

PHP Ratchet サーバーがメッセージを発行します。

public function onPublish(\Ratchet\ConnectionInterface $conn, $topic, $event, array $exclude, array $eligible) {
    switch ($topic) {
        case 'http://localhost/enter_room':
            $foundChater = $this->allChater[$conn];
            $newChaterName = $event['username'];
            $foundChater->setChatName($newChaterName);
            break;
        case 'send_message':
            $foundChater = $this->allChater[$conn];
            $event['username']=$foundChater->getChatName();
            break;
    }
    $topic->broadcast($event);
    echo "onPublish {$conn->resourceId}\n";
}

ここに画像の説明を入力

excludeme を指定してパブリッシュが機能しない理由がわかりません。
上記の 2 つの firefox では、右の firefox は次のように述べています。メッセージは自分自身に表示されるべきではありませんが、表示されています。

doc ref: アウトバーン バージョン 1 javascript publish with excludeme

doc ref: ラチェット onpublish

doc ref: ラチェット トピック ブロードキャスト

4

1 に答える 1

1

私はちょうどそれを修正しました。
私はなんてばかだ。パラメータ「array $exclude」
を処理していませんでした。また、$topic->broadcast($event) を使用して、すべてにブロードキャストを強制しました。
今私は関数を作成します

/**
 * check whitelist and blacklist
 * 
 * @param array of sessionId $exclude -- blacklist
 * @param array of sessionId $eligible -- whitelist
 * @return array of \Ratchet\ConnectionInterface
 */
private function getPublishFinalList(array $exclude, array $eligible) {
    //array of sessionId
    $allSessionId = array();
    $this->allChater->rewind();
    while ($this->allChater->valid()) {
        array_push($allSessionId, $this->allChater->current()->WAMP->sessionId);
        $this->allChater->next();
    }

    //if whitelist exist, use whitelist to filter
    if (count($eligible) > 0) {
        $allSessionId = array_intersect($allSessionId, $eligible);
    }

    //then if blacklist exist, use blacklist to filter
    if (count($exclude) > 0) {
        $allSessionId = array_diff($allSessionId, $exclude);
    }

    //return array of connection        
    $result = array();
    $this->allChater->rewind();
    while ($this->allChater->valid()) {
        $currentConn = $this->allChater->current();
        if (in_array($currentConn->WAMP->sessionId, $allSessionId)) {
            array_push($result, $currentConn);
        }
        $this->allChater->next();
    }
    return $result;
}

onPublish では、$topic->broadcast($event) を使用しなくなりました。

    $conn2PublishArray = $this->getPublishFinalList($exclude, $eligible);
    foreach ($conn2PublishArray as $conn2Publish) {
        $conn2Publish->event($topic, $new_event);
    }    

接続クラスには、「サブスクライバー」に直接メッセージを送信できる「even」メソッドがあります。
Ratchet.Wamp.WampConnection イベント メソッド

于 2014-08-08T04:02:16.560 に答える