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 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 【黄啊码】thinkphp6结合workerman、websocket案例 -> 正文阅读

[网络协议]【黄啊码】thinkphp6结合workerman、websocket案例

更多问题可加入技术交流群,定时分享技术知识,薇?:ama_huangama

安装workerman教程看这里——》https://markwcm.blog.csdn.net/article/details/119084920

更改配置服务的路径:

注意这里:支持数组定义多个服务的?

html代码


<!DOCTYPE html>  
<html>  
<head>  
<title>HTML5</title>  
<meta charset="utf-8" />  
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>  
<script>  
$(function() {      
    var socket;  
    var readyState = ["connecting", "connected", "closing", "closed"];  
    /* 打开连接事件 */  
    $("button:eq(0)").click(function() {  
        try {  
             /* 连接 */  
            //  socket = new WebSocket("ws://39.96.9.241:6789");  
             socket = new WebSocket("ws://127.0.0.1:2346");
             /* 绑定事件 */  
             socket.onopen = function() {  
                 $("#msg").html("连接成功...");  
             };  
               
            socket.onmessage = function(e) {  
                 $("#msg").html($("#msg").html() + "<br />" + e.data);  
             };  
               
             socket.onclose = function() {  
                 $("#msg").html($("#msg").html() + "<br />关闭连接...");  
             };  
        } catch(exception) {  
            $("#msg").html($("#msg").html() + "<br />有错误发生");  
        }  
    });  
      
    /* 发送数据事件 */  
    $("button:eq(1)").click(function() {  
        /* 检查文本框是否为空 */  
        if($("#data").val() == "") {  
            alert("请输入数据!");  
            return;  
        }  
          
        try {  
            socket.send($("#data").val());  
            $("#msg").html($("#msg").html() + "<br />发送数据:" + $("#data").val());  
        } catch (exception) {  
            $("#msg").html($("#msg").html() + "<br />发送数据出错");  
        }  
          
        /* 清空文本框 */  
        $("#data").val("");  
    });  
      
    /* 断开连接 */  
    $("button:eq(2)").click(function() {  
        socket.close();  
    });  
});  
</script>  
</head>  
  
<body>  
<h1>WebSocket示例</h1>  
<input type="text" id="data" />  
<button>打开连接</button>  
<button>发送数据</button>  
<button>关闭连接</button>  
<p id="msg"></p>  
</body>  

php代码

<?php 

namespace app\service\controller;

use think\facade\View;
use think\worker\Server;
use think\facade\Session;
use GatewayClient\Gateway;

// require_once '../vendor/autoload.php';
// use app\index\model\Memberfriend;
// use app\index\model\Member;
class Worker extends Server{

    protected $socket = 'websocket://0.0.0.0:2346';

    protected $client_id;

    public function onMessage($connection, $data)
    {
        dump($data);
        $connection->send("rqwerqwerqwer");
        
    }

    /**
     * 当连接建立时触发的回调函数
     * @param $connection
     */
    public function onConnect($connection)
    {
        // 生成一个唯一用户的客户端id
        $this->client_id = time().rand(100,999);
        // 将生成的client_id赋给当前连接
        $connection->client_id = $this->client_id;

        //$this->worker->transport='ssl';
        // 在当前worker对象中新添属性  保存当前登录的用户的client_id 和 连接对象
        // 以便进行推送
        $this->worker->clientIdConnections[$connection->client_id] = $connection;

        // 将生成的client_id发送给客户端
        $json = [
            'type'  =>  'bind',
            'from'  =>  'worker',
            'to'    =>  $connection->client_id,
            'content' => $this->client_id
        ];
        $connection->send(json_encode($json,true));
    }

    /**
     * 当连接断开时触发的回调函数
     * @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)
    {

    }
    
}

案例结果如下:

?附加workman心跳案例

<?php
require_once __DIR__ . '/Workerman/Autoloader.php';
use Workerman\Worker;
use Workerman\Lib\Timer;

// 心跳间隔55秒
define('HEARTBEAT_TIME', 55);

$worker = new Worker('text://0.0.0.0:2345');

$worker->onMessage = function($connection, $msg) {
    // 给connection临时设置一个lastMessageTime属性,用来记录上次收到消息的时间
    $connection->lastMessageTime = time();
    // 其它业务逻辑...
};

// 进程启动后设置一个每10秒运行一次的定时器
$worker->onWorkerStart = function($worker) {
    Timer::add(10, function()use($worker){
        $time_now = time();
        foreach($worker->connections as $connection) {
            // 有可能该connection还没收到过消息,则lastMessageTime设置为当前时间
            if (empty($connection->lastMessageTime)) {
                $connection->lastMessageTime = $time_now;
                continue;
            }
            // 上次通讯时间间隔大于心跳间隔,则认为客户端已经下线,关闭连接
            if ($time_now - $connection->lastMessageTime > HEARTBEAT_TIME) {
                $connection->close();
            }
        }
    });
};

Worker::runAll();

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-09-18 10:36:22  更:2021-09-18 10:38:14 
 
开发: 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年6日历 -2024/6/27 2:08:04-

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