Создание / Управление частными комнатами с помощью Ratchet?

Я делаю приложение ios chat. После изучения необходимых технологий и протоколов я решил попробовать websockets. По причинам, наша вершина стека основана на php, и я узнал о трещотке как о веб-сокетах для PHP. Я сделал простой чат-сервер для ios front-end с чтения документация. Чат работает очень хорошо, и мне это тоже удобно. Я хотел знать, как создать отдельные частные чаты. Нужно ли запускать отдельный экземпляр цикла событий сокета для отдельных комнат?

  • Сделанный мной пример сервера использует один цикл обработки событий для
    управление пользовательскими подключениями и рассылка сообщений различным
    идентификатор соединения / пользователя. Я действительно пытался высматривать создание частного
    чаты, но не нашли никакой информации, где я мог бы быть
    уверенная в себе. Должен ли я виртуально управлять каждым соединением / идентификатором пользователя?
    в этом цикле событий, например, решить, какие пользователи могут общаться друг с другом
    напрямую контролируя рассылку сообщений? Или это их
    действительно отдельный способ сделать это? Это пример цикла событий как
    документация, которую я реализовал:

       require dirname(__DIR__) . '/vendor/autoload.php';
    
    $server = IoServer::factory(
    new HttpServer(
    new WsServer(
    new Chat()
    )
    ),
    8080
    );
    
    $server->run();
    

Я хочу сказать, что я являюсь разработчиком на iOS / Android и на самом деле не являюсь экспертом или свободно владею технологиями веб-интерфейса и бэкэнда. Я занимаюсь веб-программированием как хобби, и я делал все, что мог, занимаясь поиском и исследованиями, поэтому, пожалуйста, не возражайте, если мои вопросы звучат глупо.

Спасибо,

4

Решение

Нужно ли запускать отдельный экземпляр цикла событий сокета для отдельных комнат?

Нет. Нужна только одна петля. Ваш фрагмент в порядке. Что вам нужно сделать, это настроить Chat класс, так что он принимает дополнительный параметр из пользовательского ввода — номер комнаты / имя.

Например, пользователь отправляет сообщение {"cmd":"msg", "message":"Hi", "room": 1}, затем Chat следует отправлять сообщения только пользователям, которые присоединились к этой комнате. И, конечно же, вы должны реализовать другие пользовательские методы, такие как {"cmd":"join", "room": 1}, {"cmd":"leave", "room": 1}

1

Другие решения

Ну, я мог бы немного опоздать с ответом, но вот как я это сделал.

Вы должны реализовать WampServerInterface вместо MessageComponentInterface в своем классе чата (если вы этого еще не сделали).

Как сказано выше, ваш фрагмент в порядке.

Вот мой класс чата:

class Chat implements WampServerInterface
{

protected $conversationId;

public function __construct(){
$this->conversationId = null;
}

public function onSubscribe(ConnectionInterface $conn, $conversation_id){

$this->conversationId = $conversation_id;

echo "Client $conn->resourceId assigned to the conversation : $conversation_id\n";

}

public function onPublish(ConnectionInterface $conn, $conversation_id, $event, array $exclude, array $eligible){

echo "Message sent to $conversation_id : $event";

// ... save in Database or else

// Send data to conversation
$this->conversationId->broadcast($message);

}

}

Это только для подключения к одной комнате.

Однако, если вы хотите, чтобы несколько чатов работали одновременно, вам следует обратить внимание на код Ratchet на Github.

Я не знаю, что вы использовали для внешнего интерфейса, я лично использую autobahn.js для создания экземпляра соединения с сервером (используя храповик).

0

По вопросам рекламы [email protected]