Хранение имен ресурсов php websocket в массиве php - как получить к ним доступ - PullRequest
0 голосов
/ 09 октября 2018

В моем файле php websocket, когда подключается новый клиент, я сохраняю имя ресурса в массиве, так что я могу получить его позже.Вот строка, которую я использую для этого:

$socketResource = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($socketResource, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($socketResource, 0, PORT);
socket_listen($socketResource);

//This is an array of user subscriptions
$message_subscriptions = array();
$resources = array();

$clientSocketArray = array($socketResource);
while (true) {
    $newSocketArray = $clientSocketArray;
    socket_select($newSocketArray, $null, $null, 0, 10);

if (in_array($socketResource, $newSocketArray)) {
    $newSocket = socket_accept($socketResource);
    $clientSocketArray[] = $newSocket;

    $header = socket_read($newSocket, 1024);
    $chatHandler->doHandshake($header, $newSocket, HOST_NAME, PORT);

    socket_getpeername($newSocket, $client_ip_address);
    //Store this socket as a resource for later use
    array_push($resources, $socketResource);

    //The file continues.

, так что теперь у меня есть массив $resources, который выглядит следующим образом:

array(
    0 => resource id #7
);

У меня также есть другой массив, который связывает идентификатор пользователя с позицией ресурса в этом массиве.Когда другой пользователь отправляет сообщение на этот идентификатор пользователя, я хочу, чтобы сообщение (попытка) было отправлено через веб-сокет, связанный с resource id #7.Я хочу сделать это на стороне сервера, чтобы только предполагаемый пользователь мог видеть сообщение.

Пока я пробовал это, но оно не работает:

$resource = $resources[0];

foreach($clientSocketArray as $clientSocket){
    if((string)$clientSocket == $resource){
        @socket_write($clientSocket,$message,$messageLength);
    }
}

Возможно ли это?Если да, то как мне это сделать?

Я уже получил свой код JavaScript, который читает на стороне клиента.Там нет проблем.

Спасибо.

1 Ответ

0 голосов
/ 11 октября 2018

Мне не хватало команд socket_bind и socket_listen.Теперь мой цикл выглядит следующим образом:

foreach($clientSocketArray as $clientSocket)
{
    if((string)$clientSocket == $resource){
        echo "found socket " . (string)$clientSocket;
        @socket_bind($clientSocket, 0, PORT);
        @socket_listen($clientSocket);
        @socket_write($clientSocket,$message,$messageLength);
    }
}

Мне пришлось сделать некоторые дополнительные вещи в php-socket.php, чтобы сообщения отправлялись на правильное имя сокета, но это было основной проблемой.

...