workerman安装与配置

  • 先安装fastadmin框架,为了使用composer ,不使用也可以
  • 宝塔里,解除全部禁用函数
  • linux上检测环境 curl -Ss http://www.workerman.net/check.php | php
  • 安装 composer require workerman/workerman
  • 启动命令
    php start.php start
    php start.php start -d
    php start.php stop
    php start.php restart
  • 端口 9510推送 9511text
  • 在根目录编写服务端
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2020/9/8
* Time: 8:38
*/
use Workerman\Worker;
use Workerman\Lib\Timer;
use think\Db;
require_once __DIR__ . '/vendor/workerman/workerman/Autoloader.php';
class Yaoguisocket{
   public $worker;
   public function init(){
       define('HEARTBEAT_TIME', 60);
       // 实例化 Worker 类对象
       $worker = new Worker('websocket://0.0.0.0:9510');
       $arr_updateok=array();
       // 设置进程数3
       $worker->count = 4;
       // 服务端进程启动后设置10秒定时器,定时遍历关3闭心跳超时1的66
       $worker->onWorkerStart = function($worker) {
           //创建内部协议
           // 开启一个内部端口,方便内部系统推送数据,Text协议格式 文本+换行符
           $inner_text_worker = new Worker('text://0.0.0.0:9511');
           $inner_text_worker->onMessage = function($connection, $datajson)
           {
               // $data数组格式,里面有uid,表示向那个uid的页面推送数据
               $arrdata = json_decode($datajson, true);
               $ret=self::push_all($arrdata['msg']);
               // 返回推送结果
               $connection->send($ret ? $arrdata['msg'].'ok' : 'fail');
           };
           // ## 执行监听 ##
           $inner_text_worker->listen();
           //创建心跳定时器
           Timer::add(20, function()use($worker){
               $time_now = time();
               foreach($worker->connections as $connection) {
                   // lastMessageTime设置为当前时间
                   if (empty($connection->lastMessageTime)) {
                       $connection->lastMessageTime = $time_now;
                       continue;
                   }
                   // 客户端已经下线
                   if ($time_now - $connection->lastMessageTime > HEARTBEAT_TIME) {
                       $connection->close();
                   }
               }
           });
       };
       // 设置回调函数
       // 绑定连接的回调函数,这个函数会在有客户端连接时调用
       // 参数:TcpConnection 类的对象,代表每个客户端
       $worker->onConnect = function( $connection ) {
           // 向这个客户端发数据
           $connection->send('欢迎您3~');
       };
       // 接收消息
       $worker->onMessage = function($connection, $data) {
           $connection->lastMessageTime = time();
           //如果不是心跳就返回数据
           if ($data=='heart'){
               $connection->send('this heart');

           }else{
               $connection->send($data);
           }
       };
       return $worker;
   }
   public function __construct()
   {
       $this->worker=self::init();
       $this->worker->runAll();
   }
   public function push_all($msg){
       foreach($this->worker->connections as $c)
       {
           $c->send($msg);
           return true;
       }
       return false;
   }
}
$ws=new Yaoguisocket();

在后端编写调用代码

public function pushall(){
       // 建立socket连接到内部推送端口
       $client = stream_socket_client('tcp://127.0.0.1:9511', $errno, $errmsg, 1);
       // 推送的数据,包含uid字段,表示是给这个uid推送
       $data = array('msg'=>'update|1.2.1');
        // 发送数据,注意5678端口是Text协议的端口,Text协议需要在数据末尾加上换行符
       fwrite($client, json_encode($data)."\n");
        // 读取推送结果
       echo fread($client, 8192);
   }

在前端编写js代码

<!DOCTYPE html>
<html>
<head>
    <title>HTML5</title>
    <meta charset="utf-8" />
</head>
<body>
<h1>WebSocket示例</h1>
<button>打开连接</button>
<button>发送数据</button>
<button>关闭连接</button>
<p id="msg"></p>
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js">
</script>
<script>
    function getdate(){
        var date=new Date();
        var year=date.getFullYear();
        var month=date.getMonth()+1;
        var day=date.getDate();
        var hh=date.getHours();
        var mm=date.getMinutes();
        var ss=date.getSeconds();
        return year+"年"+month+"月"+day+"日"+hh+":"+mm+":"+ss;
    }
    $(function() {
        var socket;
        $("button:eq(0)").click(function () {
            /* 连接 */
            socket = new WebSocket("ws://124.156.135.71:9510");
            /* 绑定事件 */
            socket.onopen = function() {
                $("#msg").html("连接成功...");
                setInterval(function () {
                    socket.send('heart')
                }, 10000)
            };
            socket.onmessage = function(e) {
                $("#msg").html($("#msg").html() + "<br />收到数据:" + e.data+'     '+getdate());
            };
            socket.onclose = function() {
                $("#msg").html($("#msg").html() + "<br />关闭连接..."+'     '+getdate());
            };
        });
        /* 发送数据事件 */
        $("button:eq(1)").click(function() {
            socket.send("hsfsdfdfsf9i");
        });
        /* 断开连接 */
        $("button:eq(2)").click(function() {
            socket.close();
        });
    });
</script>
</body>
</html>
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值