Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Websocket multi channels (https://javascript.ru/forum/misc/68686-websocket-multi-channels.html)

blvckmeister 02.05.2017 22:58

Websocket multi channels
 
Всем доброго времени суток.

Написал чат, хочу сделать отдельные комнаты, соответственно в room1 юзер должен получать сообщения тех кто отправляет их в этой комнате. К моему сожалению это не получается реализовать, сообщения приходят во все комнаты сразу, скажем так, что я не могу понять, как реализовать разные потоки/каналы, для разных комнат, конечно могу запустить для каждой комнаты свой сокет-сервер, но я думаю, что это просто бред. Прошу Вашей помощи в этом вопросе, а именно, есть какой-то вариант создания таких потоков если запущен только 1 сокет-сервер?

Скрипт чата, описанный ниже генерируется с помощью пхп, а алгоритм следующий:
1. Я кликаю на 1 из 3 комнат.
2. После клика id этой комнаты отправляется с помощью AJAX в php-обработчик, который после подключения к mysql выводит все сообщения для комнаты с переданным id.
3. Сгенерированная страница выводится в блок.

Я пробовал сделать следующее: для каждой комнаты (для каждого div, в который выводится сгенерированная страница) указывать уникальный id, но это не помогло, ведь js генерирует чат на стороне клиента, а сообщение отправляется на сервер, которому всё равно какие id я там прописал... Искал решения данной проблемы, но не нашел ничего, в голове крутится многопоточность, но нигде нет информации, научите пользоваться гуглом(

Спасибо!

Скрипт чата
var socket = new WebSocket("ws://localhost:8080");
socket.onopen = function() {
  alert("Соединение установлено.");
};

socket.onclose = function(event) {
  if (event.wasClean) {
    alert('Соединение закрыто чисто');
  } else {
    alert('Обрыв соединения');
  }
  alert('Код: ' + event.code + ' причина: ' + event.reason);
};

socket.onmessage = function(event) {
  let message = JSON.parse(event.data);
$('#listingm').append('<li class="clearfix"><div class="message-data" style="text-align:left;"><span class="message-data-name"><i class="fa fa-circle online"></i>+message.name+</span><span class="message-data-time">10:12 AM, Today</span></div><div class="message my-message">+message.msg+</div></li>');
  document.getElementById('chat-history').scrollTop = 9999;
};

socket.onerror = function(error) {
  alert("Ошибка " + error.message);
};

$(#sendings).click(function(){
    	    let message = {
    				name: "'.$_SESSION['personaname'].'",
    				msg: $('#message-to-send').val()
    			}
    			socket.send(JSON.stringify(
    				message));
    			return false;
    	});

Сокет-сервер
<?php
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use MyApp\Chat;

    require dirname(__DIR__) . '/vendor/autoload.php';

    $server = IoServer::factory(
        new HttpServer(
            new WsServer(
                new Chat()
            )
        ),
        8080
    );

    $server->run();
?>

Rise 04.05.2017 00:27

blvckmeister, запись "ws://localhost:8080?room=1", чтение $room = $conn->WebSocket->request->getQuery()->get('room');

blvckmeister 04.05.2017 22:08

Rise, спасибо, будем пробовать!


Часовой пояс GMT +3, время: 12:28.