Я делаю приложение 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 и на самом деле не являюсь экспертом или свободно владею технологиями веб-интерфейса и бэкэнда. Я занимаюсь веб-программированием как хобби, и я делал все, что мог, занимаясь поиском и исследованиями, поэтому, пожалуйста, не возражайте, если мои вопросы звучат глупо.
Спасибо,
Нужно ли запускать отдельный экземпляр цикла событий сокета для отдельных комнат?
Нет. Нужна только одна петля. Ваш фрагмент в порядке. Что вам нужно сделать, это настроить Chat
класс, так что он принимает дополнительный параметр из пользовательского ввода — номер комнаты / имя.
Например, пользователь отправляет сообщение {"cmd":"msg", "message":"Hi", "room": 1}
, затем Chat
следует отправлять сообщения только пользователям, которые присоединились к этой комнате. И, конечно же, вы должны реализовать другие пользовательские методы, такие как {"cmd":"join", "room": 1}
, {"cmd":"leave", "room": 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 для создания экземпляра соединения с сервером (используя храповик).