• Swoole学习第三天,webscoket server 、task


    前几天项目比较忙,今天继续学习

    Swoole_webscoket_server 

    server端代码,测试的发现一个坑,可真的是坑死我了

    <?php
    /**
     * Created by PhpStorm.
     * User: xuan_
     * Date: 2019/10/23
     * Time: 16:39
     */
    
    class Ws {
    
        const HOST = "0.0.0.0";
        const PORT = "9502";
    
        public $ws = null;
    
        public $_set = [
            'enable_static_handler' => true,  //开启静态文件请求处理功能, 需配合document_root使用
            'document_root' => "/data/www",  //配置静态文件根目录,与enable_static_handler配合使用。
            'worker_num' => 2,              //设置启动的Worker进程数
    
            //配置Task进程的数量,配置此参数后将会启用task功能。所以Server务必要注册onTask、onFinish2个事件回调函数。如果没有注册,服务器程序将无法启动。
            'task_worker_num' => 2,
        ];
    
        public function __construct()
        {
            $this->ws = new swoole_websocket_server(self::HOST, self::PORT);
            $this->ws->set($this->_set);
            $this->ws->on('open', [$this, 'onOpen']);
            $this->ws->on('message', [$this, 'onMessage']);
            $this->ws->on('task', [$this, 'onTask']);
            $this->ws->on('finish', [$this, 'onFinish']);
            $this->ws->on('close', [$this, 'onClose']);
    
    
    
            $this->ws->start();
        }
    
    
        /**
         * 监听ws打开事件
         * @param $ws
         * @param $request
         */
        public function onOpen($ws, $request){
            var_dump($request->fd);
        }
    
        /**
         * 监听ws消息事件
         * @param $ws
         * @param $frame
         */
    
        public function onMessage($ws, $frame){
            echo "WS_server-push-message:".$frame->data ."
    ";
    
            $data = [
                'task' => 1,
                'fd' => $frame->fd,
            ];
            $ws->task($data);
            $ws->push($frame->fd, "server-push:".date('Y-m-d H:i:s')."
    ");
        }
    
        /**
       * 投递一个异步任务到task_woker 中 * 在task_worker进程内被调用。worker进程可以使用swoole_server_task函数向task_worker进程投递新的任务。 * 当前的Task进程在调用onTask回调函数时会将进程状态切换为忙碌,这时将不再接收新的Task,当onTask函数返回时会将进程状态切换为空闲然后继续接收新的Task。 * @param $ws * @param $task_id * @param $work_id * @param $data * @return string
    */

      
    public function onTask($ws, $task_id, $work_id, $data){ print_r($data); sleep(10); return 'on task '.$task_id.' 10s'."
    "; //告诉worker进程  } /** * 当worker进程投递的任务在task_worker中完成时,task进程会通过swoole_server->finish()方法将任务处理的结果发送给worker进程。 * @param $ws * @param $taskId * @param $data */ public function onFinish($ws, $taskId, $data){ echo "taskId:{$taskId}
    "; echo "finish-data-sucess:{$data}
    "; } /** * 关闭客户端 * @param $ws * @param $fd */ public function onClose($ws, $fd){ echo 'closeClient:'.$fd."
    "; } } $obj = new Ws();

    client端代码

    <html>
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h1>WS Client</h1>
    <script>
    
        var wsUrl = "ws://127.0.0.1:9502";
    
        var ws = new WebSocket(wsUrl);
    
        ws.onopen = function (evt) {
            ws.send('hello swoole');
            console.log('conected-success');
        };
    
        ws.onmessage = function (evt) {
            console.log('ws-server return' + evt.data);
        }
    
        ws.onclose = function (evt) {
            console.log('close');
        }
    
        ws.onerror = function (evt,e) {
            console.log('error:' + e.error + '
    ');
        }
    
    </script>
    </body>
    </html>

      碰到一个错误: WebSocket connection to 'ws://127.0.0.1:9502/' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSE

    这个错误是因为我在云服务器运行的 在本地电脑访问html文件,所以一直没办法建立正确链接webscoket,这里

    var wsUrl = "ws://127.0.0.1:9502";

    要写成云服务器的IP才可以正确访问,还有记得端口要开放,还有防火墙设置
  • 相关阅读:
    [那些你所不知道的鬼畜写法]数据结构小探
    索引
    数据类型
    存储引擎
    事务
    视图、触发器、存储过程、自定义函数
    约束
    数据库介绍
    线程基础、线程池
    操作系统基础
  • 原文地址:https://www.cnblogs.com/caoql/p/11727123.html
Copyright © 2020-2023  润新知