jsp项目开发案例_Laravel 中使用 swoole 项目实战开发案例一 (建立 swoole 和前端通信)life...

1 开发需要环境

工欲善其事,必先利其器。在正式开发之前我们检查好需要安装的拓展,不要开发中发现这些问题,打断思路影响我们的开发效率。

  • 安装 swoole 拓展包
  • 安装 redis 拓展包
  • 安装 laravel5.5 版本以上

如果你还不会用swoole就out了

程序猿的生活:Laravel 中使用 swoole 项目实战开发案例二 (后端主动分场景给界面推送消息)life​zhuanlan.zhihu.com

我的官方群点击此处。获取更多的swoole学习资料以及视频源码笔记。

2 Laravel 生成命令行

  1. php artisan make:command SwooleDemo
class SwooleDemo extends Command
{protected $signature = 'swoole:demo';protected $description = '这是关于swoole的一个测试demo';public function __construct()
{parent::__construct();
}public function handle()
{$this->line("hello world");
}
}

我们分别运行 php artisan 指令和 php artisan swoole:demo 会看到关于这个命令的说明,和输出 hello world。(laravel 命令行用法详解)

3 命令行逻辑代码

  • 编写一个最基础的 swoole 命令行逻辑代码
<?phpnamespace AppConsoleCommands;use IlluminateConsoleCommand;
use IlluminateSupportFacadesRedis;class SwooleDemo extends Command
{// 命令名称protected $signature = 'swoole:demo';// 命令说明protected $description = '这是关于swoole websocket的一个测试demo';// swoole websocket服务private static $server = null;public function __construct(){parent::__construct();}// 入口public function handle(){$this->redis = Redis::connection('websocket');$server = self::getWebSocketServer();$server->on('open',[$this,'onOpen']);$server->on('message', [$this, 'onMessage']);$server->on('close', [$this, 'onClose']);$server->on('request', [$this, 'onRequest']);$this->line("swoole服务启动成功 ...");$server->start();}// 获取服务public static function getWebSocketServer(){if (!(self::$server instanceof swoole_websocket_server)) {self::setWebSocketServer();}return self::$server;}// 服务处始设置protected static  function setWebSocketServer():void{self::$server  = new swoole_websocket_server("0.0.0.0", 9502);self::$server->set(['worker_num' => 1,'heartbeat_check_interval' => 60,    // 60秒检测一次'heartbeat_idle_time' => 121,        // 121秒没活动的]);}// 打开swoole websocket服务回调代码public function onOpen($server, $request){if ($this->checkAccess($server, $request)) {self::$server->push($request->fd,"打开swoole服务成功!");}}// 给swoole websocket 发送消息回调代码public function onMessage($server, $frame){}// http请求swoole websocket 回调代码public function onRequest($request,$response){}// websocket 关闭回调代码public function onClose($serv,$fd){$this->line("客户端 {$fd} 关闭");}// 校验客户端连接的合法性,无效的连接不允许连接public function checkAccess($server, $request):bool{$bRes = true;if (!isset($request->get) || !isset($request->get['token'])) {self::$server->close($request->fd);$this->line("接口验证字段不全");$bRes = false;} else if ($request->get['token'] !== "123456") {$this->line("接口验证错误");$bRes = false;}return $bRes;}// 启动websocket服务public function start(){self::$server->start();}}

编写 websoket js 代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>swoole测试</title><meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no">
</head>
<body>
<h1>这是一个测试</h1>
</body>
<script>var ws;//websocket实例var lockReconnect = false;//避免重复连接var wsUrl = 'ws://{{$_SERVER["HTTP_HOST"]}}:9502?page=home&token=123456';function initEventHandle() {ws.onclose = function () {reconnect(wsUrl);};ws.onerror = function () {reconnect(wsUrl);};ws.onopen = function () {//心跳检测重置heartCheck.reset().start();};ws.onmessage = function (event) {//如果获取到消息,心跳检测重置//拿到任何消息都说明当前连接是正常的var data = JSON.parse(event.data);heartCheck.reset().start();}}createWebSocket(wsUrl);/*** 创建链接* @param url*/function createWebSocket(url) {try {ws = new WebSocket(url);initEventHandle();} catch (e) {reconnect(url);}}function reconnect(url) {if(lockReconnect) return;lockReconnect = true;//没连接上会一直重连,设置延迟避免请求过多setTimeout(function () {createWebSocket(url);lockReconnect = false;}, 2000);}//心跳检测var heartCheck = {timeout: 60000,//60秒timeoutObj: null,serverTimeoutObj: null,reset: function(){clearTimeout(this.timeoutObj);clearTimeout(this.serverTimeoutObj);return this;},start: function(){var self = this;this.timeoutObj = setTimeout(function(){//这里发送一个心跳,后端收到后,返回一个心跳消息,//onmessage拿到返回的心跳就说明连接正常ws.send("heartbeat");self.serverTimeoutObj = setTimeout(function(){//如果超过一定时间还没重置,说明后端主动断开了ws.close();//如果onclose会执行reconnect,我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次}, self.timeout);}, this.timeout);},header:function(url) {window.location.href=url}}
</script>
</html>
  • 访问前端页面 (显示如下说明前后端链接成功)

c9c22bc0378f5f5a8b92f2cf22f89d11.png

希望以上内容能帮助到大家,加入我的官方群点击此处。获取更多的swoole学习资料以及视频源码笔记。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/469001.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker系列第01部分:介绍+虚拟化+什么是Decker+组件

0 应用部署难点 1.在软件开发中&#xff0c;最麻烦的事情之一就是环境配置。在正常情况下&#xff0c;如果要保证程序能运行&#xff0c;我们需要设置好操作系统&#xff0c;以及各种库和组件的安装。2.举例来说&#xff0c;要运行一个Python程序&#xff0c;计算机必须要有 P…

1.7.08:字符替换

08:字符替换 查看提交统计提问总时间限制: 1000ms内存限制: 65536kB描述把一个字符串中特定的字符全部用给定的字符替换&#xff0c;得到一个新的字符串。 输入只有一行&#xff0c;由一个字符串和两个字符组成&#xff0c;中间用单个空格隔开。字符串是待替换的字符串&#xf…

net.conn read 判断数据读取完毕_1.5 read, write, exit系统调用

接下来&#xff0c;我将讨论对于应用程序来说&#xff0c;系统调用长成什么样。因为系统调用是操作系统提供的服务的接口&#xff0c;所以系统调用长什么样&#xff0c;应用程序期望从系统调用得到什么返回&#xff0c;系统调用是怎么工作的&#xff0c;这些还是挺重要的。你会…

Docker系列第02部分:Docker安装与启动

1 安装环境说明 这里将Docker安装到CentOS上。注意&#xff1a;这里建议安装在CentOS7.x以上的版本&#xff0c;在CentOS6.x的版本中&#xff0c;安装前需要安装其他很多的环境而且Docker很多补丁不支持更新。 2 Docker安装与使用 2.0 windows安装 1 windows安装&#xff08…

Docker系列第03部分:列出镜像+搜索镜像+拉取镜像+删除镜像

1.什么是Docker镜像 Docker镜像是由文件系统叠加而成&#xff08;是一种文件的存储形式&#xff09;。最底端是一个文件引导系统&#xff0c;即bootfs&#xff0c;这很像典型的Linux/Unix的引导文件系统。Docker用户几乎永远不会和引导系统有什么交互。实际上&#xff0c;当一…

c语言sort函数_C语言的那些经典程序 第八期

戳“在看”一起来充电吧!C语言的那些经典程序 第八期上期带大家欣赏的指针经典程序&#xff0c;感觉如何&#xff1f;这期我们准备了几个新指针的内容&#xff0c;灵活运用指针可以大大减少程序的复杂度&#xff0c;接下来就让小C来说说这三个有关指针应用的经典程序吧&#xf…

Docker系列第04部分:查看容器+创建容器+启动容器+文件挂载+删除容器

1 容器的创建和启动 1.1 虚拟机的生命周期 1.2 容器的生命周期 2、容器操作 2.1 查看容器 查看正在运行容器&#xff1a; docker ps 查看所有的容器&#xff08;启动过的历史容器&#xff09; docker ps –a 查看最后一次运行的容器&#xff1a; docker ps -l 查看停止的容…

java程序设计及实践实践代码_杭+新闻:姚争为老师把程序设计讲“活”了,满是代码的枯燥课程被学生“秒杀”...

通讯员 陈鑫 杨鹏飞记者 方秀芬作为专业选修课&#xff0c;Java程序设计和Web程序设计&#xff0c;这两门满是代码的课程&#xff0c;看似很枯燥&#xff0c;但在杭师大信息科学与工程学院却爆红&#xff0c;每学期都遭“秒杀”&#xff0c;以前线下课&#xff0c;提前20分钟准…

Docker系列第05部分:实战部署应用全流程

1 MySQL部署 1.1拉取MySQL镜像 docker pull mysql 查看镜像&#xff1a; 1.2创建MySQL容器 docker run -di --namepinyougou_mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD123456 mysql:5.7 # -p 代表端口映射&#xff0c;格式为 宿主机映射端口:容器运行端口 # -e 代表添加…

Vim安装插件在命令行下看代码

这几天我又想抛弃source insight 了&#xff0c;主要是太慢了 安装如下 VIM万能插件 或者使用 sudo apt-get installexuberant-ctags 安装 我主要是使用函数跳转功能&#xff0c;需要记住几个指令 1、生成tags用来实现函数跳转 这样会生成一个tags文件&#xff0c;作为跳…

Docker系列第06部分:备份与迁移+dockerfile

1 备份与迁移 1.1 容器保存为镜像 docker commit pinyougou_nginx mynginx# pinyougou_nginx是容器名称 # mynginx是新的镜像名称 # 此镜像的内容就是你当前容器的内容&#xff0c;接下来你可以用此镜像再次运行新的容器1.2 镜像备份 docker save -o mynginx.tar mynginx #…

流浪地球开机动画包zip_影视日报|合家欢动画电影quot;许愿神龙quot;定档1.15;流浪地球加长版定档11.26...

1、合家欢动画电影"许愿神龙"定档1.15动画电影《许愿神龙》正式定档2021年1月15日&#xff0c;并发布定档海报。2、白客等万万兄弟助力易小星"沐浴之王"由易小星执导&#xff0c;彭昱畅、乔杉领衔主演&#xff0c;卜冠今、苇青主演&#xff0c;金世佳友情出…

Git 分布式版本控制工具01:Git介绍+下载+安装

1. 前言 1.1 什么是Git Git 是一个分布式版本控制工具&#xff0c;通过Git 仓库来存储和管理源代码文件文件。 在IDEA开发工具中可以集成Git&#xff1a; 集成后在IDEA中可以看到Git相关图标&#xff1a; 可以通过启动两个IDEA窗口模拟两个开发人员来展示Git的使用&#xf…

无法解析的外部符号,无法解析的外部命令

1.这个是因为有相关的lib包没有被引用进去 解决办法&#xff1a; 1. 2. 转载于:https://www.cnblogs.com/hcfan/p/6638980.html

Android Adb 源码分析

扭起屁股得意洋洋 最近&#xff0c;我负责的项目因为临近量产&#xff0c;把之前的userdebug版本关闭&#xff0c;转成了user版本&#xff0c;增加selinux的权限&#xff0c;大家都洋溢在项目准备量产的兴奋和喜悦之中不能自拔 谁知&#xff0c;好景不长&#xff0c;user版本…

kvm虚拟化_KVM 虚拟化环境搭建 - WebVirtMgr

前文《KVM 虚拟化环境搭建 - ProxmoxVE》已经给大家介绍了开箱即用的 PVE 系统&#xff0c;PVE 是方便&#xff0c;但还是有几点问题&#xff1a;第一&#xff1a;始终是商用软件&#xff0c;虽然可以免费用&#xff0c;但未来版本还免费么&#xff1f;商用的法律风险呢&#x…

Git 分布式版本控制工具02:Git代码托管服务列表与使用

1常用的Git代码托管服务 Git中存在两种类型的仓库&#xff0c;即本地仓库和远程仓库。 Git远程仓库中比较常用的有GitHub、码云、GitLab等。 名称网址说明gitHubGitHub: Where the world builds software GitHub一个面向开源及私有软件项目的托管平台&#xff0c;因为只支持…

基于Springboot外卖系统19:用户地址+默认收货地址

1. 用户地址簿功能 1.1 需求分析 地址簿&#xff0c;指的是移动端消费者用户的地址信息&#xff0c;用户登录成功后可以维护自己的地址信息。 同一个用户可以有多个地址信息&#xff0c;但是只能有一个默认地址。 对于地址簿管理&#xff0c;我们需要实现以下几个功能&#…

基于Springboot外卖系统20:前端菜品展示+菜品数量查询

1 菜品展示 1.1 需求分析 用户登录成功后跳转到系统首页&#xff0c;在首页需要根据分类来展示菜品和套餐。如果菜品设置了口味信息&#xff0c;需要展示 按钮&#xff0c;否则显示按钮。 1.2 前端页面分析 在开发代码之前&#xff0c;需要梳理一下前端页面和服务端的交互过…