Ratchet WAMP onpublish всегда публикует для всех клиентов, включая вызывающую публикацию или нет?

Я только что создал чат hello world для Ratchet WAMP + autobahn версии 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 сказал: I am bar. Сообщение не должно отображаться у себя, но оно есть.

ссылка на документ: публикация javascript autobahn версии 1 с excludeme

ссылка на документ: храповик при публикации

ссылка на документ: трансляция темы с храповым механизмом


person Community    schedule 06.08.2014    source источник
comment
Возможно, Ratchet не поддерживает этот вариант. Кстати: что не так с Thruway + Crossbar?   -  person oberstet    schedule 06.08.2014
comment
Здравствуйте, мистер оберстет, я еще не пробовал их, попробуйте завтра. большое спасибо. Ха-ха, может быть, вы помните меня в другом посте о PHP-сервере RPC..... В любом случае, если не ограничиваться PHP, какой сервер вы можете предложить, который лучше всего будет работать с Crossbar? будет ли tavendo.com иметь проект сервера WAMP?   -  person    schedule 06.08.2014
comment
о, я только что нашел ваш образец сейчас github. com/tavendo/AutobahnPython/blob/master/examples/twisted/   -  person    schedule 06.08.2014
comment
Может быть, это недостаточно ясно: вам не нужен другой сервер, кроме Crossbar. Crossbar будет размещать (и отслеживать) компоненты вашего приложения и напрямую обслуживать клиентов (для WebSocket, а также статических веб-ресурсов — если хотите).   -  person oberstet    schedule 06.08.2014
comment
Я предполагаю, что Ratchet поддерживает excludeme, я просто var_dump массива $exclude, он показывает правильный исключенный идентификатор сеанса, мой код не работает, потому что я не обрабатывал его, вместо этого я использую трансляцию. Я постараюсь найти другое решение как можно скорее, например. функция подключения-›события, но мне пора идти, мой офис закрыт.   -  person    schedule 07.08.2014


Ответы (1)


Я только что исправил это.
Какой же я дурак. Я не обрабатывал параметр "массив $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);
    }    

класс подключения имеет метод «даже», который может отправить сообщение «подписчику» напрямую.
Метод события Ratchet.Wamp.WampConnection

person Community    schedule 08.08.2014