В моем файле 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, который читает на стороне клиента.Там нет проблем.
Спасибо.