zoukankan      html  css  js  c++  java
  • 如何利用swoole搭建一個簡易聊天室

    <?php
    class Chat
    {
        const HOST = '0.0.0.0';//ip地址 0.0.0.0代表接受所有ip的访问
        const PART = 82;//端口号
        private $server = null;//单例存放websocket_server对象
        private $connectList = [];//客户端的id集合
        
        public function __construct()
        {
            //实例化swoole_websocket_server并存储在我们Chat类中的属性上,达到单例的设计
            $this->server = new swoole_websocket_server(self::HOST, self::PART);
            //监听连接事件
            $this->server->on('open', [$this, 'onOpen']);
            //监听接收消息事件
            $this->server->on('message', [$this, 'onMessage']);
            //监听关闭事件
            $this->server->on('close', [$this, 'onClose']);
            //设置允许访问静态文件
            //$this->server->set([
             //   'document_root' => '/grx/swoole/public',//这里传入静态文件的目录
            //    'enable_static_handler' => true//允许访问静态文件
            //]);
            //开启服务
            $this->server->start();
        }
        
        /**
         * 连接成功回调函数
         * @param $server
         * @param $request
         */
        public function onOpen($server, $request)
        {
            echo $request->fd . '连接了' . PHP_EOL;//打印到我们终端
            $this->connectList[] = $request->fd;//将请求对象上的fd,也就是客户端的唯一标识,可以把它理解为客户端id,存入集合中
        }
    
        /**
         * 接收到信息的回调函数
         * @param $server
         * @param $frame
         */
        public function onMessage($server, $frame)
        {
            echo $frame->fd . '来了,说:' . $frame->data . PHP_EOL;//打印到我们终端
            //将这个用户的信息存入集合
            foreach ($this->connectList as $fd) {//遍历客户端的集合,拿到每个在线的客户端id
                //将客户端发来的消息,推送给所有用户,也可以叫广播给所有在线客户端
                $server->push($fd, json_encode(['no' => $frame->fd, 'msg' => $frame->data]));
            }
        }
    
        /**
         * 断开连接回调函数
         * @param $server
         * @param $fd
         */
        public function onClose($server, $fd)
        {
            echo $fd . '走了' . PHP_EOL;//打印到我们终端
            $this->connectList = array_diff($this->connectList, [$fd]);//将断开了的客户端id,清除出集合
        }
        
    }
    
    $obj = new Chat();
    <!doctype html>
    
    <html>
    
    <head>
    
        <meta charset="utf-8">
    
        <title>聊天室</title>
    
        <script src="http://libs.baidu.com/jquery/1.9.1/jquery.min.js"></script>
    
    </head>
    
    <body>
    
    <textarea class="log" style=" 100%; height: 500px;">
    
    =======聊天室======
    
    </textarea>
    
    <input type="button" value="连接" onClick="link()">
    
    <input type="button" value="断开" onClick="dis()">
    
    <input type="text" id="text">
    
    <input type="button" value="发送" onClick="send()">
    
    <script>
    
        function link(){
    
            var url='ws://148.70.98.236:82';
    
            socket=new WebSocket(url);
    
            socket.onopen=function(){log1('连接成功')}
    
            socket.onmessage=function(msg){log(msg.data);console.log(msg);}
    
            socket.onclose=function(){log1('断开连接')}
    
        }
    
        function dis(){
    
            socket.close();
    
            socket=null;
    
        }
    
        function log1(var1) {
            $('.log').append(var1+'
    ');
        }
        function log(var1){
          var  v=$.parseJSON(var1)
            $('.log').append('用户'+v['no']+'说:'+v['msg']+'
    ');
        }
    
        function send(){
            var text=$('#text').val();
    
            socket.send(text);
        }
    
        function send2(){
    
            var json = JSON.stringify({'type':'php','msg':$('#text2').attr('value')})
    
            socket.send(json);
    
        }
    
    </script>
    
    </body>
    
    </html>
  • 相关阅读:
    费用流
    平面最近点对
    纸牌均分问题
    cdq分治模板
    费解的开关
    斐波那契和排列组合性质
    主席树
    Springboot使用EasyExcel(仅限自己收藏)
    vue项目中h5移动端中通过flex布局实现首尾固定,中间滚动(借鉴)
    vue路由参数的获取、添加和替换
  • 原文地址:https://www.cnblogs.com/songbao/p/11225870.html
Copyright © 2011-2022 走看看