TP5+web-msg-sender实现即时推送(即时站内信)

TP5实时消息推送实现

1.下载web-msg-sender 下载链接。并解压缩到任意目录(你可以放到tp5目录里,也可以放到www目录)
2.启动:linux系统cd到到web-msg-sender目录里运行php start.php start -d
windows系统进入到框架目录里双击start_for_win.bat文件启动。
windows会看见如下输出
在这里插入图片描述
3. 服务器推送
/application/lib/event/PushEvent.php

namespace app\lib\event;
 
/**
 * 推送事件
 * 典型调用方式:
 * $push = new PushEvent();
 * $push->setUser($user_id)->setContent($string)->push();
 *
 * Class PushEvent
 * @package app\lib\event
 */
class PushEvent
{
    /**
     * @var string 目标用户id
     */
    protected $to_user = '';
 
    /**
     * @var string 推送服务地址
     */
    protected $push_api_url = 'http://127.0.0.1:2121/';//如果在服务器上127.0.0.1换成服务器上的域名:2121
 
    /**
     * @var string 推送内容
     */
    protected $content = '';
 
    /**
     * 设置推送用户,若参数留空则推送到所有在线用户
     *
     * @param string $user
     * @return $this
     */
    public function setUser($user = '')
    {
        $this->to_user = $user ? : '';
        return $this;
    }
 
    /**
     * 设置推送内容
     *
     * @param string $content
     * @return $this
     */
    public function setContent($content = '')
    {
        $this->content = $content;
        return $this;
    }
 
    /**
     * 推送
     */
    public function push()
    {
        $data = [
            'type' => 'publish',
            'content' => $this->content,
            'to' => $this->to_user,
        ];
        $ch = curl_init ();
        curl_setopt($ch, CURLOPT_URL, $this->push_api_url);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
        $res = curl_exec($ch);
        curl_close($ch);
        dump($res);
 
    }
}

4.控制器调用
/application/demo/controller/PushDemo.php

namespace app\demo\controller;
 
 
use app\lib\event\PushEvent;
 
/**
 * 推送demo
 *
 * Class PushDemo
 * @package app\demo\controller
 */
class PushDemo
{
    /**
     * 推送一个字符串
     */
    public function pushAString()
    {
        $uid= input('uid') ? : $string;//接收客户端发过来的uid进行业务操作
         $string = 'Man Always Remember Love Because Of Romance Only';//推送的消息,实际开发中换成根据uid查的业务值
        $push = new PushEvent();
        $push->setUser()->setContent($string)->push();
 
 
    }
 
    /**
     * 推送目标页
     *
     * @return \think\response\View
     */
    public function targetPage()
    {
        return view();
    }
}

5.客户端(浏览器)收
/application/demo/view/PushDemo/targetPage.html

 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<strong id="count"></strong>
 
<h1 id="target"></h1>
</body>
</html>
<script src="http://cdn.bootcss.com/jquery/3.1.0/jquery.min.js"></script>
<script src='http://cdn.bootcss.com/socket.io/1.3.7/socket.io.js'></script>
<script>
    jQuery(function ($) {
 
        // 连接服务端
        var socket = io('http://127.0.0.1:2120'); //这里当然填写真实的地址了
        // uid可以是自己网站的用户id,以便针对uid推送以及统计在线人数
        uid = 123;
        // socket连接后以uid登录
        socket.on('connect', function () {
            socket.emit('login', uid);
        });
        // 后端推送来消息时
        socket.on('new_msg', function (msg) {
            console.log("收到消息:" + msg);
            $('#target').append(msg).append('<br>');
        });
        // 后端推送来在线数据时
        socket.on('update_online_count', function (online_stat) {
            console.log(online_stat);
            $('#count').html(online_stat);
        });
    })
 
</script>

效果如下
在这里插入图片描述在这里插入图片描述如果http://www.memebackstage.com/index/push/pushAString没请求成功
http://www.memebackstage.com/index/push/targetpage 页面就会一直请求127.0.0.1::2120,直到推送成功
刷新一次http://www.memebackstage.com/index/push/pushAString,
http://www.memebackstage.com/index/push/targetpage 页面就会再被推送一次
在这里插入图片描述
注意
在服务器上的话别忘了在安全组开端口(入方向);并重启服务器
如果服务器是windows,要把PHP路径加到环境变量,并重启服务器。
因为我是Windows服务器,Linux没有测,以后会补上
至此完毕 。

转载自 :https://my.oschina.net/inuxor/blog/737863#comment-list
https://blog.youkuaiyun.com/h330531987/article/details/78081392
参考资料(有用必读)
http://www.ptbird.cn/web-msg-sender-send-content.html
https://www.workerman.net/web-sender

<think>好的,用户让我重新生成一个包含多个包组的RTCP Transport-cc反馈包的例子,并且要求用特定的格式展示,左边是原始数据,右边是解释,最后还要解析整个字段,包括包组数量和状态。之前我给的例子可能不够符合用户指定的格式,所以需要调整。 首先,我需要回顾用户提供的格式示例,确保新的例子符合他们的结构要求。用户希望数据每行四个字节,左侧是原始数据,右侧是对应的解释。同时,最后要有一个整体的解析,说明有几个包组以及它们的状态。 用户之前提到Transport-cc反馈包的结构,包括基础头部、SSRC、Base时间戳、包组数据等。现在需要按照这个结构生成一个具体的例子,并详细分解每个部分。此外,用户可能希望这个例子能更贴近实际的RFC标准,比如RFC 5104或RFC 8888中的定义,确保技术准确性。 接下来,我需要确认Transport-cc反馈包的正确格式。根据RFC 5104,Transport-cc反馈包属于RTCP FB(RTPFB)类型,FMT为15。包结构包括基础头部、SSRC、媒体源SSRC、base sequence number、packet status count、reference time、fb pkt count,以及后续的packet chunks和recv deltas。 用户提供的示例中可能有错误,比如之前的FMT值是否正确。之前例子中的FMT是19,但根据RFC,Transport-cc的FMT应该是15。所以需要修正这一点,确保FMT字段正确。 然后,构建具体的十六进制数据。需要确保每个字段的长度和位置正确,比如基础头部4字节,SSRC各4字节,base sequence number和packet status count各2字节,reference time 3字节,fb pkt count 1字节,然后是packet chunks和recv deltas部分。 包组的数量取决于packet status count的值。例如,如果packet status count是6,则可能有多个包组。每个包组由packet chunk和对应的recv delta组成。需要确保packet chunks的数量和recv deltas的数量匹配。 接下来,生成示例数据,并按照用户指定的格式排列。每一行四个字节,左侧是十六进制数据,右侧是解释。例如: 0x80, 0xC9, 0x00, 0x13, // V=2, P=0, FMT=15, PT=205, length=19 然后解析每个字段的含义,如版本、填充位、FMT、PT类型、长度等。 在整体解析部分,需要计算包组的数量。例如,packet status count为6,可能表示有6个包状态,每个状态对应一个包组。同时,需要分析每个包组的延迟变化趋势,判断网络状态是延迟增加、减少还是稳定。 最后,确保相关问题部分与用户之前的例子一致,提出5个相关问题,帮助用户进一步理解。 需要检查是否有遗漏或错误,比如字段长度是否符合RFC标准,包组数量是否正确,以及解析是否准确。确保所有部分都符合用户指定的格式,并且技术细节正确无误。 </think>``` 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |V=2|P| FMT=15 | PT=205 | length=19 | 0x80C90013 → 版本2,无填充,FMT=15(Transport-cc),PT=205(RTPFB) +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | SSRC of packet sender | 0x01234567 → 发送端SSRC +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | SSRC of media source | 0x89ABCDEF → 媒体源SSRC +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | base sequence number | packet status count | 0x00010006 → 基准序列号=1,包状态数=6 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | reference time (24 bits) | fb pkt count | 0x12345601 → 基准时间戳=0x123456(24位),反馈包计数=1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | packet chunk=0xA1F2 | packet chunk=0xB3E1 | 0xA1F2B3E1 → 包状态编码(详见解析) +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | packet chunk=0xC5D0 | recv delta=0x001F | 0xC5D0001F → 包状态+接收延迟(501×250ns=125.25ms) +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | recv delta=0x002A | recv delta=0x0035 | 0x002A0035 → 延迟差值(66ms, 83.75ms) +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | recv delta=0x0040 | recv delta=0x004B | 0x0040004B → 延迟差值(102.5ms, 119.75ms) +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | recv delta=0x0056 | recv delta=0x0061 | 0x00560061 → 延迟差值(135.5ms, 152.75ms) +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | recv delta=0x006C | zero padding=0x00 | 0x006C0000 → 延迟差值(171ms),补零对齐 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ``` --- ### **字段解析** #### **1. 基础头部(前4字节)** - **V=2**:RTCP版本(RFC 3550) - **P=0**:无填充 - **FMT=15**:Transport-cc反馈格式(RFC 8888) - **PT=205**:RTPFB类型(RTCP Feedback报文) - **length=19**:总长度为(19+1)*4=80字节 #### **2. 核心字段** - **SSRC of packet sender**:0x01234567(反馈发送端标识) - **SSRC of media source**:0x89ABCDEF(对应媒体流) - **base sequence number**:0x0001(基准序列号=1) - **packet status count**:0x0006(共6个包状态) - **reference time**:0x123456(基准时间戳=1193046微秒=1.193s) - **feedback packet count**:0x01(此流第1次反馈) #### **3. 包组数据(Packet Chunks + Recv Deltas)** - **packet chunk编码规则**: - `0xA1F2`:T=1(独立编码),S=0(无连续丢包),F=1(后续有状态),值=0x1F2(状态码) - `0xB3E1`:T=0(组合编码),值=0x3E1(状态码) - `0xC5D0`:T=1(独立编码),S=1(有连续丢包),值=0x05D0(状态码) - **recv delta计算**: - 每个delta为32位有符号整数,单位250ns: - `0x001F` → +501×0.25=125.25ms - `0x002A` → +66ms - `0x0035` → +83.75ms - `0x0040` → +102.5ms - `0x004B` → +119.75ms - `0x0056` → +135.5ms - `0x0061` → +152.75ms - `0x006C` → +171ms #### **4. 包组数量与状态** - **共6个包组**(由`packet status count=6`确定) - **延迟趋势**:所有delta为正值且递增(125.25→171ms),表明网络**持续拥塞**,需降低发送速率 --- ### **关键验证点** 1. **包组对齐**:每个`recv delta`占4字节,总长度需4字节对齐(末尾补零) 2. **时间戳同步**:`reference time`与RTP时间戳同步,用于计算绝对延迟 3. **状态压缩**:通过T/S/F标志压缩包状态编码,减少带宽消耗 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值