morozovsk / websocket

simple php websocket server + demos + yii/yii2 integration + php 7 support
368 stars 74 forks source link

Можно ли создавать комнаты? #36

Closed borodatych closed 7 years ago

borodatych commented 7 years ago

Здравствуйте.

Хочу интегрировать ваше решение к себе на сайт. Подскажите можно ли как то отправлять сообщение конкретно одному пользователю? В примерах Чат3 - улучшенная вариация Чат2 ?

Спасибо.

morozovsk commented 7 years ago

Здравствуйте. Как запрограммируете так и будет. К сожалению у меня нет готового примера для чаткомнат.

borodatych commented 7 years ago

Не так выразился с чат-комнатами, хотя возможно близко. Я как то могу на стороне сервера отправить сообщение конкретному пользователю, а не всем сразу?

И что скажете по примерам, конкретнее второй вопрос про чат3?

morozovsk commented 7 years ago

Да, в примере Чат3 показано как отправить одному человеку.

borodatych commented 7 years ago

Да - это ответ на то что чат3 улучшенная версия чат2?

#!/usr/bin/env php
<?php
$userId = @$argv[1];
$message = @$argv[2];

if( $userId && $message )
{
    $localsocket = 'tcp://127.0.0.1:8010';
    $instance = stream_socket_client ($localsocket, $errno, $errstr);//соединямся с вебсокет-сервером

    fwrite($instance, json_encode(['message' => $message, 'userId' => $userId])  . "\n");//отправляем сообщение
    ///fwrite($instance, json_encode(['message' => $message, 'clientId' => $userId])  . "\n");//отправляем сообщение
}
else die("No_Data\n");

Не отправляет, к сожалению. Пробовал уже и к веб-адресу цепляться, не помогло. Так же пробовал и по userId и по clientId отправлять. Подскажите пожалуйста, что упускаю?

morozovsk commented 7 years ago

нет, чат3 - это не улучшенная версия чат2. ничего не могу подсказать, мало исходных данных, опишите подробно всё что делаете

borodatych commented 7 years ago
  1. Скачал через composer websocket и websocket-examples
  2. В www/vendor/morozovsk/websocket-examples/chat3/server/index.php для websocket прописал свой IP
  3. Прописал этот же IP в www/vendor/morozovsk/websocket-examples/chat3/client/index.html для new WebSocket
  4. Зашел на www.site.ru/vendor/morozovsk/websocket-examples/chat3/client/ - все работает
  5. Код для www/vendor/morozovsk/websocket-examples/chat3/server/send.php привел в прошлом сообщение
  6. В консоле пытаюсь отправить сообщение: www/vendor/morozovsk/websocket-examples/chat3/server/send.php 23 qwerrty где 23 мой ID, что отдался на страницы с чатом. На страницы сообщение не появилось.

Предполагаю нет связи между localsocket и websocket ??

morozovsk commented 7 years ago

вот код примера чат3:

public $userIds = [];
    protected function onOpen($connectionId, $info) {//it is called when the connection is open
        $message = 'пользователь #' . $connectionId . ' : ' . var_export($info, true) . ' ' . stream_socket_get_name($this->clients[$connectionId], true);
        foreach ($this->clients as $clientId => $client) {
            $this->sendToClient($clientId, $message);
        }
        $info['GET'];//or use $info['Cookie'] for use PHPSESSID or $info['X-Real-IP'] if you use proxy-server like nginx
        parse_str(substr($info['GET'], 1), $_GET);//parse get-query
        //var_export($_GET['id']);
        $this->userIds[$connectionId] = $_GET['userId'];
    }

и в нём видно, что userId - это не номер соединения, а параметр из GET-запроса. если налдо оправлять по номеру соединения, то строчку $this->userIds[$connectionId] = $_GET['userId']; надо заменить на $this->userIds[$connectionId] = $connectionId;

borodatych commented 7 years ago

Сори, моя не внимательность. Подкиньте ссылок, что бы почитать чем отличается чат3 от чат2. Вы как то писали про 1024 потока на одном сокете. Не увидел реализации ни в чат2 ни в чат3, это домашнее задание или проглядел?

morozovsk commented 7 years ago

https://github.com/morozovsk/websocket-examples/tree/master/chat2/server https://github.com/morozovsk/websocket-examples/tree/master/chat3/server

https://github.com/morozovsk/websocket/wiki : pecl/event (needed for more then 1000 connections without php recompilation)

needed packages: php-pear libevent-2.0-5 libevent-dev libssl-dev pkg-config command: pecl install event add "extension=event.so" to php.ini

borodatych commented 7 years ago

То есть, если установить:

needed packages: php-pear libevent-2.0-5 libevent-dev libssl-dev pkg-config
command: pecl install event
add "extension=event.so" to php.ini

То вопрос об ограничение решен? И чат3 в этом случае оптимальнее, так как запускать один процесс, за коим следить проще, когда как в чат2 все равно стартовать два скрипта?

Если не хотим что либо устанавливать, то для ограничения юзаем чат2, где запускаем один мастер и воркеров по кол-ву ядер или меньше, но не больше, если таковые устроят?

morozovsk commented 7 years ago

да

borodatych commented 7 years ago

Сори, что перееоткрыл