tp5.1+workerman实现简单的聊天器

tp5.1+workerman实现简单的聊天器

安装tp5.1及workerman

composer create-project topthink/think=5.1.x-dev tp5

composer require topthink/think-worker=2.0.*

php think worker(测试是否安装成功)。

代码

woker.php

<?php
namespace app\push\controller;

use think\worker\Server;
use Workerman\Worker;

class Woker extends Server
{
		//云服务器(阿里云/腾讯云等)用户,注意您的公网ip实际可能是个代理ip(例如阿里云的专有网络),公网ip并不属于当前的服务器,所以无法通过公网ip监听()
        protected $socket = 'websocket://0.0.0.0:8888';
        protected $processes = 1;
        protected $uidConnections = array();
        static $count  = 0;

        /**
         *  * 收到信息
         *   * @param $connection
         *    * @param $data
         *     */
        public function onMessage($connection, $data)
        {
                // 判断当前客户端是否已经验证,既是否设置了uid,设置了直接发送消息,未设置第一次为设置uid
                if(!isset($connection->uid))
                {
                        // 没验证的话把第一个包当做uid(这里为了方便演示,没做真正的验证)
                        $connection->uid = $data;
                        /* 保存uid到connection的映射,这样可以方便的通过uid查找connection,
                         * 实现针对特定uid推送数据
                         */
                        $this->uidConnections[$connection->uid] = $connection;
                        $data = '用户 '.$connection->uid.'加入房间 ||'.self::$count;
                        $this->broadcast($data);
                        return;
                }else{
                        $data = '用户 '.$connection->uid.':'.$data.'||'.self::$count;
                        $this->broadcast($data);
                }
        }

        /**
         * 当连接建立时触发的回调函数
         * @param $connection
         */
        public function onConnect($connection)
        {
                self::$count++;

        }

        public function onClose($connection)
        {
                self::$count--;
                if(isset($connection->uid))
                {
                        // 连接断开时删除映射
                        $data = '用户 '.$connection->uid.'退出房间 ||'.self::$count;
                        $this->broadcast($data);
                        unset($this->uidConnections[$connection->uid]);
                }
        }

        /**
         * 当客户端的连接上发生错误时触发
         * @param $connection
         * @param $code
         * @param $msg
         */
        public function onError($connection, $code, $msg)
        {
                echo "error $code $msg\n";
        }

        /**
         * 每个进程启动
         * @param $worker
         */
        public function onWorkerStart($socket)
        {

        }

        // 向所有验证的用户推送数据
        function broadcast($message)
        {
                foreach($this->uidConnections as $connection)
                {
                        $connection->send($message);
                }
        }

        // 针对uid推送数据
        function sendMessageByUid($uid, $message)
        {
                if(isset($this->uidConnections[$uid]))
                {
                        $connection = $this->uidConnections[$uid];
                        $connection->send($message);
                        return true;
                }
                return false;
        }


}

Index.php

<?php
namespace app\push\controller;

use think\controller;

class Index extends Controller
{
	public function index(){
		$name=$_GET['name'];
		$this->assign('name',$name);
		return view();
	}
}

index.html

<!DOCTYPE html>
<html lang="en">
        <head>
                <meta charset="UTF-8">
                <title>聊天室</title>
        </head>
        <body>
                <div class="title" style="display:inline-block">当前聊天室<span id="count">0</span></div>
                        <hr/>
                        <div id="aaa" class="conten title" ></div>
                <div class="fasong title">
                        <textarea id="textxinxi" class="xinxi"></textarea>
                        <input type="button" value="发送" class="fasongbtn" onclick="fasong()">
                </div>
                <script>
                        var name="{$name}";
                        ws = new WebSocket("ws://123.57.286.160:8888");
                        ws.onopen=function(){
                        var uid= name;
                                console.log(uid);
                        ws.send(uid);
                        }

                        ws.onmessage=function(e){
                                console.log(e);
                                var aaa = document.getElementById('aaa');
                                var count = document.getElementById('count');
                                var data=e.data.split("||")[0];
                                var count1 = e.data.split("||")[1];
                                aaa.innerHTML+= data+ '<br>';
                                count.innerHTML= count1;
                        }

                        function fasong(){
                        let textxinxi =document.getElementById('textxinxi').value;
                        let text= '';
                        document.getElementById('textxinxi').value =text;
                        ws.send(textxinxi);
                        }
                </script>
        </body>
</html>

worker_class配置(位置config下woker_server.php)

'worker_class'   => ['app\push\controller\Woker'],

配置完成后重启workerman

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值