加入收藏 | 设为首页 | 会员中心 | 我要投稿 四平站长网 (https://www.0434zz.com.cn/)- 云服务器、对象存储、基础存储、视频终端、数据应用!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

如何利用swoole搭建一個簡易聊天室

发布时间:2022-08-02 14:25:55 所属栏目:PHP教程 来源:互联网
导读:?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() { //实例化sw
<?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="width: 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+'rn');
    }
    function log(var1){
      var  v=$.parseJSON(var1)
        $('.log').append('用户'+v['no']+'说:'+v['msg']+'rn');
    }
 
    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>

(编辑:四平站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读