Как ответить всем клиентам с веб-сокетом?

Я работаю над небольшим проектом с PHP-Websocket.

Сторона сервера работает с этим https://github.com/ghedipunk/PHP-Websockets.

На стороне сервера:

require "PHP-Websockets/websockets.php";

class Server extends WebSocketServer
{
    private $_connecting = 'Connecting..';
    private $_welcome = 'SOCKET SERVER!';


    protected function connected($user)
    {
        // Send welcome message to user when connected

    }    



    protected function process($user, $message)
    {
        // data sent from client
        $json = json_decode($message);

        //prepare data response to client
        $response = json_encode(array('type'=>'notify', 'message'=>'Client'.$user->id.' has sent a request.'));
        $this->send($user, $response);
    }

    protected function closed($user)
    {
        // Alert on server
        echo "User $user->id has closed the connection".PHP_EOL;
    }

    public function __destruct()
    {
        echo "Server Closed!".PHP_EOL;
    }
}

$addr = 'localhost';
$port = '2207';
$server = new Server($addr, $port);
$server->run();

Клиентская сторона:

<script>
var uri = "ws://localhost:2207";
function socket_connect(){
    socket = new WebSocket(uri);
    if(!socket || socket == undefined) return false;

    socket.onopen = function(){
        console.log('Connected to Server!');
    }

    socket.onerror = function(){
        console.log('Connection Failed!');
    }

    socket.onclose = function(){
        socket_log('Connection Closed! ')
    }

    socket.onmessage = function(e){
        //var response_data = e.data;
        var msg = JSON.parse(e.data); //PHP sends Json data to client
        console.log(msg.message);
        var new_response = '<li>'+msg.message+'</li>;
        $('#response').append(new_response);
    }
}

function send_data_to_server(data){
    if(!socket || socket == undefined) return false;
    socket.send(JSON.stringify(data));
}

$(document).ready(function(){
    socket_connect();


    $('#send_request').click(function(){
        send_data_to_server({message: 'Message sent from Client'});
    });
});
</script>

<input type="button" id="send_request" value="Send Request to Server" />

<ul id="responses"></ul>

Все отлично работает с этим кодом выше.

Когда Клиент1 отправляет запрос Серверу, Сервер мгновенно отвечает ему. НО другие клиенты не могут видеть ответное сообщение.

Итак, я хочу пойти дальше: когда клиент отправляет запрос на сервер, сервер отвечает ВСЕМ клиентам, чтобы все клиенты могли видеть сообщение.

Как я могу это сделать?

Заранее спасибо && извините за мой плохой английский!


person Nấm Lùn    schedule 04.03.2014    source источник
comment
Согласно этому руководству, уже может существовать WebSocketServer::$users проходимая переменная, которая вы можете foreach.   -  person Passerby    schedule 04.03.2014
comment
Я знаю, что это старо, но как у вас работал ghedipunk API? Я рассматриваю это прямо сейчас для базового приложения веб-сокетов. Кто-нибудь в этой теме нашел лучше?   -  person Robert    schedule 07.01.2016


Ответы (2)


Когда пользователь подключается, вам нужно добавить его в массив со всеми остальными пользователями. Когда один разъединится, удалите его из этого массива.

Затем, когда вы хотите отправить сообщение каждому пользователю, выполните итерацию по массиву и отправьте сообщение каждому подключенному пользователю.

person Loïc    schedule 04.03.2014

WebSocketServer class has WebSocketServer::$users variable.

Если вы перебираете WebSocketServer::$users в функции split_packet, а затем вызываете основной процесс, он будет работать. В последнем исходном коде повторите строку № 405.

//original
if ((preg_match('//u', $message)) || ($headers['opcode']==2)) {
        //$this->stdout("Text msg encoded UTF-8 or Binary msg\n".$message); 
        $this->process($user, $message);
      } else {
        $this->stderr("not UTF-8\n");
      }

//должны изменить

if ((preg_match('//u', $message)) || ($headers['opcode']==2)) {
        //$this->stdout("Text msg encoded UTF-8 or Binary msg\n".$message); 
        foreach($this->users as $usr){
            $this->process($usr, $message);
        }
      } else {
        $this->stderr("not UTF-8\n");
      }
person sharif779    schedule 11.04.2018