使用Swoole服务搭建简易聊天室代码

使用Swoole服务搭建简易聊天室

    • 服务端
    • 客户端
    • 启动服务端
    • 浏览器中访问聊天室

服务端

创建chatserver.php 文件



class Chat
{
     
    const HOST = '0.0.0.0';//ip地址 0.0.0.0代表接受所有ip的访问
    const PART = 81;//端口号
    private $server = null;//单例存放websocket_server对象

    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' => '/data/web/chat/public',//这里传入静态文件的目录
            'enable_static_handler' => true//允许访问静态文件
        ]);
        //开启服务
        $this->server->start();
    }

    /**
     * 连接成功回调函数
     * @param $server
     * @param $request
     */
    public function onOpen($server, $request)
    {
     
        echo $request->fd . '连接了' . PHP_EOL;//打印到我们终端
    }

    /**
     * 接收到信息的回调函数
     * @param $server
     * @param $frame
     */
    public function onMessage($server, $frame)
    {
     
    /**
         * TCP连接迭代器,可以使用foreach遍历服务器当前所有的连接,此属性的功能与swoole_server->connnection_list是一致的,但是更加友好。遍历的元素为单个连接的fd
         *
         * 连接迭代器依赖pcre库,未安装pcre库无法使用此功能
         *
         *      foreach($server->connections as $fd)
         *      {
         *          $server->send($fd, "hello");
         *      }
         *
         *      echo "当前服务器共有 ".count($server->connections). " 个连接\n";
         *
         * @var \Swoole\Connection\Iterator
         */
        echo $frame->fd . '来了,说:' . $frame->data . PHP_EOL;//打印到我们终端
        foreach ($server->connections as $fd) {
     //遍历TCP连接迭代器,拿到每个在线的客户端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;//打印到我们终端
    }

}


$obj = new Chat();


?>

客户端

创建liaotian.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://20.20.24.131:81';

        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 + '\r\n');
    }

    function log(var1) {
      
        var v = $.parseJSON(var1)
        $('.log').append('用户' + v['no'] + '说:' + v['msg'] + '\r\n');
    }

    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>

启动服务端

php chatserver.php

在这里插入图片描述

浏览器中访问聊天室

http://20.20.24.131/chat/liaotian.html
使用Swoole服务搭建简易聊天室代码_第1张图片点击链接,可以看到页面显示连接成功

打开服务端,可以看到
使用Swoole服务搭建简易聊天室代码_第2张图片表示连接成功

输入奇葩天地网 点击发送
使用Swoole服务搭建简易聊天室代码_第3张图片服务端,可以看到收到了客户端的聊天内容
使用Swoole服务搭建简易聊天室代码_第4张图片
客户端,点击断开

使用Swoole服务搭建简易聊天室代码_第5张图片服务端,可以看到 客户端1,走了
使用Swoole服务搭建简易聊天室代码_第6张图片

你可能感兴趣的:(Php,websocket,Swoole)