编程学习网 > PHP技术 > swoole > swoole中使用 WebSocket异步、协程服务器|遍历链接
2021
07-05

swoole中使用 WebSocket异步、协程服务器|遍历链接


本文将给大家分享swoole中使用 WebSocket异步、协程服务器|遍历链接,希望能对大家有用

WebSocket 异步风格服务器


WebSocket\Server 继承自 Http\Server,所以 Http\Server 提供的所有 API 和配置项都可以使用。


# ws_server.php

class WebSocket

{

   public $server;

   public function __construct()

   {

       // 创建websocket服务器对象,监听0.0.0.0:9502端口

       $this->server = new Swoole\WebSocket\Server("0.0.0.0", 9502);

       // 设置服务器运行参数

       $this->server->set(array(

           'daemonize'     => 1,  // 作为守护进程运行,需同时设置log_file

           'log_file'      => '/www/logs/swoole.log',  // 指定标准输出和错误日志文件

       ));

       

       // 监听WebSocket连接打开事件

       $this->server->on('open', function ($ws, $request) {

           var_dump($request->fd, $request->get, $request->server);

           $ws->push($request->fd, "hello, welcome\n");

       });

       // 监听WebSocket消息事件

       $this->server->on('message', function ($ws, $frame) {

           echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n";

           $ws->push($frame->fd, "server: {$frame->data}");

       });

       // 监听WebSocket连接关闭事件

       $this->server->on('close', function ($ws, $fd) {

           echo "client {$fd} is closed\n";

       });

       // 通过 HTTP 请求向所有用户推送消息

       $this->server->on('request', function ($request, $response) {

           foreach ($this->server->connections as $fd) {

               // 检查连接是否为有效的 WebSocket 客户端连接,避免push失败

               if ($this->server->isEstablished($fd)) {

                   $this->server->push($fd, $request->get['message']);

               }

           }

       });

       $this->server->start();

   }

}

// 启动 WebSocket 服务器

new WebSocket();



运行并测试 WebSocket 异步风格服务器


# 如果程序已经运行,先结束进程

kill -9 11591

# 在 cli 命令行环境运行服务端

php ws_server.php

# 查看服务器监听的端口

netstat -an | grep 9502


WebSocket JS客户端


# index.js



var wsServer = 'ws://127.0.0.1:9502';

var websocket = new WebSocket(wsServer);

websocket.onopen = function (evt) {

   console.log("Connected to WebSocket server.");

   websocket.send('hello ws!');

};



websocket.onclose = function (evt) {

   console.log("Disconnected");

};



websocket.onmessage = function (evt) {

   console.log('Retrieved data from server: ' + evt.data);

};



websocket.onerror = function (evt, e) {

   console.log('Error occured: ' + evt.data);

};


客户端


Chrome/Firefox/ 高版本 IE/Safari 等浏览器内置了 JS 语言的 WebSocket 客户端

微信小程序开发框架内置的 WebSocket 客户端

异步 IO 的 PHP 程序中可以使用 Swoole\Coroutine\Http 作为 WebSocket 客户端

Apache/PHP-FPM 或其他同步阻塞的 PHP 程序中可以使用 swoole/framework 提供的同步 WebSocket 客户端

非 WebSocket 客户端不能与 WebSocket 服务器通信

WebSocket 协程风格服务器


Co\run(function () {

   $server = new Co\Http\Server("127.0.0.1", 9502, false);



   // 设置服务器运行参数

   $server->set(array(

       'daemonize'     => 1,  // 作为守护进程运行,需同时设置log_file

       'log_file'      => '/www/logs/swoole.log',  // 指定标准输出和错误日志文件

   ));



   $server->handle('/websocket', function ($request, $ws) {

       // 向客户端发送 WebSocket 握手消息

       $ws->upgrade();

       

       // 循环处理消息的接收和发送

       while (true) {

           // 接收 WebSocket 消息帧,会挂起当前协程,等待数据到来时再恢复协程的执行

           $frame = $ws->recv();

           if ($frame === false) {

               echo "error : " . swoole_last_error() . "\n";

               break;

           } else if ($frame == '') {

               break;

           } else {

               if ($frame->data == "close") {

                   $ws->close();

                   return;

               }

               

               // 向对端发送数据帧

               $ws->push("Hello {$frame->data}!");

               $ws->push("How are you, {$frame->data}?");

           }

       }

   });



   $server->handle('/', function ($request, $response) {

       $response->end(<<<HTML

<h1>Swoole WebSocket Server</h1>

<script>

var wsServer = 'ws://127.0.0.1:9502/websocket';

var websocket = new WebSocket(wsServer);

websocket.onopen = function (evt) {

   console.log("Connected to WebSocket server.");

   websocket.send('hello');

};



websocket.onclose = function (evt) {

   console.log("Disconnected");

};



websocket.onmessage = function (evt) {

   console.log('Retrieved data from server: ' + evt.data);

};



websocket.onerror = function (evt, e) {

   console.log('Error occured: ' + evt.data);

};

</script>

HTML

       );

   });



   $server->start();

});
以上就是“swoole中使用 WebSocket异步、协程服务器|遍历链接”的所有内容,想要了解更多swoole教程欢迎关注编程学习网


扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取