IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> 2021-09-07 -> 正文阅读

[PHP知识库]2021-09-07

tp5.0配置workerman实现简单聊天功能

compopser安装workerman

composer require topthink/think-worker=1.0.*

Windows系统需要

composer require workerman/workerman-for-win

在这里插入图片描述
出现以上界面代表应该安装成功了

在项目目录下新建server.php

#!/usr/bin/env php
<?php
define('APP_PATH', __DIR__ . '/application/');
define('BIND_MODULE','push/Worker');
// 加载框架引导文件
require __DIR__ . '/thinkphp/start.php';

新建worker类

<?php
namespace app\push\controller;

use think\worker\Server;

class Worker extends Server
{
    protected $socket = 'websocket://push.app:2346';

    /**
     * 收到信息
     * @param $connection
     * @param $data
     */
    public function onMessage($connection, $data)
    {
        $connection->send('我收到你的信息了');
    }

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

    }

    /**
     * 当连接断开时触发的回调函数
     * @param $connection
     */
    public function onClose($connection)
    {
        
    }

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

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

    }
}

项目根目录cmd,输入php server.php

在这里插入图片描述
测试
浏览器下F12输入

ws = new WebSocket(“ws://push.app:2346”);
ws.onopen = function() {
alert(“连接成功”);
ws.send(‘tom’);
alert(“给服务端发送一个字符串:tom”);
};
ws.onmessage = function(e) {
alert(“收到服务端的消息:” + e.data);
};

继续测试

ws.send(‘保持连接,发第二次信息,查看服务器回应’);

实现简单聊天功能

1、新建woker控制器

<?php

namespace app\push\controller;

use think\worker\Server;
use Workerman\Worker as Work;
class Worker extends Server
{
    protected $socket = 'websocket://www.tp5.0.com:2346';
    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++;

    }

    /**
     * 当连接断开时触发的回调函数
     * @param $connection
     */
    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;
    }
}

2、Index控制器

<?php
namespace app\index\controller;
use think\Controller;

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

3、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://www.tp5.com:2346");
    ws.onopen = function() {
        var uid = name;
        ws.send(uid);

    };
    ws.onmessage = function(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>

不同浏览器访问

在这里插入图片描述

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-09-08 10:26:21  更:2021-09-08 10:28:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 1:19:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码