server.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. <?php
  2. use Swoole\Http\Response;
  3. use Swoole\Http\Request;
  4. use Swoole\WebSocket\Server;
  5. //$server = new swoole_websocket_server("0.0.0.0", 9501);
  6. $server = new Server("0.0.0.0", 9501, SWOOLE_BASE);
  7. //$server->addlistener('0.0.0.0', 9502, SWOOLE_SOCK_UDP);
  8. $server->set([
  9. // 'worker_num' => 4,
  10. // 'task_worker_num' => 4,
  11. 'websocket_compression' => true,
  12. ]);
  13. function user_handshake(Request $request, Response $response)
  14. {
  15. //自定定握手规则,没有设置则用系统内置的(只支持version:13的)
  16. if (!isset($request->header['sec-websocket-key']))
  17. {
  18. //'Bad protocol implementation: it is not RFC6455.'
  19. $response->end();
  20. return false;
  21. }
  22. if (0 === preg_match('#^[+/0-9A-Za-z]{21}[AQgw]==$#', $request->header['sec-websocket-key'])
  23. || 16 !== strlen(base64_decode($request->header['sec-websocket-key']))
  24. )
  25. {
  26. //Header Sec-WebSocket-Key is illegal;
  27. $response->end();
  28. return false;
  29. }
  30. $key = base64_encode(sha1($request->header['sec-websocket-key']
  31. . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11',
  32. true));
  33. $headers = array(
  34. 'Upgrade' => 'websocket',
  35. 'Connection' => 'Upgrade',
  36. 'Sec-WebSocket-Accept' => $key,
  37. 'Sec-WebSocket-Version' => '13',
  38. 'KeepAlive' => 'off',
  39. );
  40. foreach ($headers as $key => $val)
  41. {
  42. $response->header($key, $val);
  43. }
  44. $response->status(101);
  45. $response->end();
  46. global $server;
  47. $fd = $request->fd;
  48. $server->defer(function () use ($fd, $server)
  49. {
  50. $server->push($fd, "hello, welcome\n");
  51. });
  52. return true;
  53. }
  54. //$server->on('handshake', 'user_handshake');
  55. $server->on('open', function (Server $_server, Request $request) {
  56. echo "server#{$_server->worker_pid}: handshake success with fd#{$request->fd}\n";
  57. var_dump($_server->exist($request->fd), $_server->getClientInfo($request->fd));
  58. $fd = $request->fd;
  59. // $_server->tick(2000, function($id) use ($fd, $_server) {
  60. // $_send = str_repeat('B', rand(100, 5000));
  61. // $ret = $_server->push($fd, $_send);
  62. // if (!$ret)
  63. // {
  64. // var_dump($id);
  65. // var_dump($_server->clearTimer($id));
  66. // }
  67. // });
  68. });
  69. $server->on('message', function (Server $_server, $frame) {
  70. //var_dump($frame->data);
  71. echo "received " . strlen($frame->data) . " bytes\n";
  72. if ($frame->data == "close") {
  73. $_server->close($frame->fd);
  74. } elseif ($frame->data == "task") {
  75. $_server->task(['go' => 'die']);
  76. } else {
  77. //echo "receive from {$frame->fd}:{$frame->data}, opcode:{$frame->opcode}, finish:{$frame->finish}\n";
  78. // for ($i = 0; $i < 100; $i++)
  79. {
  80. // $_send = ''
  81. $_send = base64_encode(random_bytes(rand(100, 1024)));
  82. // $_send = str_repeat('B', rand(100, 800));
  83. $_server->push($frame->fd, $_send, SWOOLE_WEBSOCKET_OPCODE_TEXT, SWOOLE_WEBSOCKET_FLAG_FIN | SWOOLE_WEBSOCKET_FLAG_COMPRESS);
  84. // echo "#$i\tserver sent " . strlen($_send) . " byte \n";
  85. }
  86. }
  87. });
  88. $server->on('close', function ($_server, $fd) {
  89. echo "client {$fd} closed\n";
  90. });
  91. $server->on('task', function ($_server, $worker_id, $task_id, $data)
  92. {
  93. var_dump($worker_id, $task_id, $data);
  94. return "hello world\n";
  95. });
  96. $server->on('finish', function ($_server, $task_id, $result)
  97. {
  98. var_dump($task_id, $result);
  99. });
  100. $server->on('packet', function ($_server, $data, $client) {
  101. echo "#".posix_getpid()."\tPacket {$data}\n";
  102. var_dump($client);
  103. });
  104. $server->on('request', function (Request $request, Response $response) {
  105. $response->end(<<<HTML
  106. <h1>Swoole WebSocket Server</h1>
  107. <script>
  108. var wsServer = 'ws://127.0.0.1:9501';
  109. var websocket = new WebSocket(wsServer);
  110. websocket.onopen = function (evt) {
  111. console.log("Connected to WebSocket server.");
  112. };
  113. websocket.onclose = function (evt) {
  114. console.log("Disconnected");
  115. };
  116. websocket.onmessage = function (evt) {
  117. console.log('Retrieved data from server: ' + evt.data);
  118. };
  119. websocket.onerror = function (evt, e) {
  120. console.log('Error occured: ' + evt.data);
  121. };
  122. </script>
  123. HTML
  124. );
  125. });
  126. $server->start();