Advertisement
Guest User

Untitled

a guest
Apr 24th, 2019
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 2.99 KB | None | 0 0
  1. КЛИЕНТСКАЯ:
  2. <!DOCTYPE html>
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  4. <head>
  5.     <script>
  6.         ws = new WebSocket("ws://localhost:8000/server.php/?user=tester01");
  7.         ws.onmessage = function(evt) {alert(evt.data);};
  8.     </script>
  9. </head>
  10. </html>
  11. SERVER:
  12. <?php
  13. require_once __DIR__ . '/vendor/autoload.php';
  14. use Workerman\Worker;
  15.  
  16. // массив для связи соединения пользователя и необходимого нам параметра
  17. $users = [];
  18.  
  19. // создаём ws-сервер, к которому будут подключаться все наши пользователи
  20. $ws_worker = new Worker("websocket://0.0.0.0:8000");
  21. $ws_worker->count = 4;
  22. $ws_worker->onConnect = function($connection){
  23.     echo "New connection\n";
  24. };
  25. // создаём обработчик, который будет выполняться при запуске ws-сервера
  26. $ws_worker->onWorkerStart = function() use (&$users)
  27. {
  28.     // создаём локальный tcp-сервер, чтобы отправлять на него сообщения из кода нашего сайта
  29.     $inner_tcp_worker = new Worker("tcp://localhost:1234");
  30.     // создаём обработчик сообщений, который будет срабатывать,
  31.     // когда на локальный tcp-сокет приходит сообщение
  32.     $inner_tcp_worker->onMessage = function($connection, $data) use (&$users) {
  33.         $data = json_decode($data);
  34.         // отправляем сообщение пользователю по userId
  35.         if (isset($users[$data->user])) {
  36.             $webconnection = $users[$data->user];
  37.             $webconnection->send($data->message);
  38.         }
  39.     };
  40.     $inner_tcp_worker->listen();
  41. };
  42.  
  43. $ws_worker->onConnect = function($connection) use (&$users)
  44. {
  45.     $connection->onWebSocketConnect = function($connection) use (&$users)
  46.     {
  47.         // при подключении нового пользователя сохраняем get-параметр, который же сами и передали со страницы сайта
  48.         $users[$_GET['user']] = $connection;
  49.         // вместо get-параметра можно также использовать параметр из cookie, например $_COOKIE['PHPSESSID']
  50.     };
  51. };
  52.  
  53. $ws_worker->onClose = function($connection) use(&$users)
  54. {
  55.     // удаляем параметр при отключении пользователя
  56.     $user = array_search($connection, $users);
  57.     unset($users[$user]);
  58. };
  59.  
  60. // Run worker
  61. Worker::runAll();
  62. SEND:
  63. <?php
  64. $localsocket = 'tcp://localhost:1234/server.php';
  65. $user = 'tester01';
  66. $message = 'test';
  67.  
  68. // соединяемся с локальным tcp-сервером
  69. $instance = stream_socket_client($localsocket);
  70. // отправляем сообщение
  71. fwrite($instance, json_encode(['user' => $user, 'message' => $message])  . "\n");
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement