热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

websocketonclose方法什么时候触发_swoft2教程系列Websocket模块

在根据SWOFT2小白教程系列-WEBSOCKET流程及配置配置websocket之后,就可以在appWebSocket下创建需要的websocket模块来处理相关逻

在根据 SWOFT2 小白教程系列-WEBSOCKET 流程及配置配置 websocket 之后,就可以在 app/WebSocket 下创建需要的 websocket 模块来处理相关逻辑。

在每个模块里允许用户处理的几个事件有 handshake open message close。

简单示例

namespace AppWebSocket;
use SwoftHttpMessageRequest;
use SwoftHttpMessageResponse;
use SwoftWebSocketServerAnnotationMappingOnClose;
use SwoftWebSocketServerAnnotationMappingOnHandshake;
use SwoftWebSocketServerAnnotationMappingOnOpen;
use SwoftWebSocketServerAnnotationMappingWsModule;
use SwooleWebSocketFrame;
use SwooleWebSocketServer;
/*** Class EchoModule** @WsModule("/echo")*/
class EchoModule
{/*** 在这里你可以验证握手的请求信息* @OnHandshake()* @param Request $request* @param Response $response* @return array [bool, $response]*/public function checkHandshake(Request $request, Response $response): array{return [true, $response];}/*** On connection has open** @OnOpen()* @param Request $request* @param int $fd*/public function onOpen(Request $request, int $fd): void{server()->push($fd, 'hello, welcome! :)'); //推送一条消息给客户端}/*** @OnMessage()* @param Server $server* @param Frame $frame*/public function onMessage(Server $server, Frame $frame){$server->push($frame->fd, 'I have received message: ' . $frame->data); //将收到的消息推送给客户端}/*** On connection closed* - you can do something. eg. record log** @OnClose()* @param Server $server* @param int $fd*/public function onClose(Server $server, int $fd): void{// you can do something. eg. record log, unbind user...}
}

客户端调用

// wsUrl = websocket host + module path
const wsUrl = 'ws://127.0.0.1:18308/echo'
let ws = new WebSocket(wsUrl)
ws.onerror = function (event){console.log("error: " + event.data)
}
ws.onopen = function (event){console.log("open: connection opened");
}
ws.onmessage = function (event){console.log("message: " + event.data);
}
ws.onclose = function (event){console.log("close: connection closed")ws.close()
}

代码解析

类注解

@WsModule 注解
websocket 模块类注解 @WsModule。

注解类: SwoftWebSocketServerAnnotationMappingWsModule

作用范围: CLASS

拥有属性:

  • path string 标明了允许ws连接的 URI path.
  • controllers array 绑定到此模块的 消息控制器 类
  • messageParser string 绑定到此模块的 消息解析器
  • defaultOpcode integer 此模块默认的消息数据 opcode

这个注解一定要写,其中path定义的是websocket路径,上面代码定义的是echo,所以客户端访问 ws://127.0.0.1:18308/echo, ws是协议,127.0.0.1是ws启动的主机IP 18308是端口,/echo就是上面注解定义的path

方法注解

@OnHandshake 注解

这个功能基本用不到,大家了解就好

方法注解 @OnHandshake 标记处理握手的方法

注解类: SwoftWebSocketServerAnnotationMappingOnHandshake

作用范围: METHOD

这方法是可选的。如果没有特殊的需求,可以忽略它,框架会帮你握手并响应握手成功。

必须返回含有两个元素的 array

  • bool 第一个元素的值来决定是否进行握手
  • 第二个元素是 response 对象 - 可以在 response 设置一些自定义 header,body 等信息

@OnOpen 注解

这个功能例如在刚连接的时候给客户端输出一些信息,或者在刚连接的时候保存 客户端 $fd

在握手成功后,就会触发 open 事件。 方法注解 @OnOpen 标记对应方法。

此时开始你就可以给客户端发消息了 :)

注解类: SwoftWebSocketServerAnnotationMappingOnOpen

作用范围: METHOD

此方法也是可选的,可以没有

@OnMessage

通过的方法注解 @OnMessage 标记一个消息处理方法。

在此阶段你可以接收到客户端的消息和发送消息给对方.

注解类:SwoftWebSocketServerAnnotationMappingOnMessage

作用范围:METHOD

当你没有绑定消息控制器时,表明你想自己处理消息阶段的逻辑,此方法是必须存在的。

当你有绑定消息控制器时,框架会自动解析消息并路由到指定的消息处理方法

@OnClose

这个功能例如在刚断开的时候给客户端输出一些信息,或者在刚断开的时候移除指定客户端 $fd

通过的方法注解 @OnClose 标记一个关闭连接时的处理方法。

注意:触发此事件时连接已被关闭,不能再给对方发消息

当客户的关闭连接或者 server 在其他地方主动关闭连接时,就会触发此事件。

你可以在这里做一些连接关闭后的工作, 比如:记录日志,解绑用户等。

注解类:SwoftWebSocketServerAnnotationMappingOnClose

作用范围:METHOD

此方法也是可选的,可以没有

说明

一般复杂的 websocket 应用 应该使用控制器来处理消息,但如果你只是简单的接收和推送消息,就没必要使用ws控制器,这个时候你就需要监听 OnMessage 注解方法 在里面处理业务逻辑,如果是复杂的ws应用应该使用控制器,如果声明了控制器 ws模块只需要在注解中定义控制器,这样消息的处理根据规则就转发到控制器里处理.

来源:https://8code.net/index/index/article/id/50

以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要

PHP进阶架构师>>>视频、面试文档免费获取​shimo.im
a9e75598f57b461a3b4edbef41dabf3c.png

或 者关注咱们下面的知乎专栏

PHP架构师圈子​zhuanlan.zhihu.com
ec6eb514a14963390341120017aebbff.png



推荐阅读
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 2.2 组件间父子通信机制详解
    2.2 组件间父子通信机制详解 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 深入解析Struts、Spring与Hibernate三大框架的面试要点与技巧 ... [详细]
  • Unity与MySQL连接过程中出现的新挑战及解决方案探析 ... [详细]
  • Spring框架中枚举参数的正确使用方法与技巧
    本文详细阐述了在Spring Boot框架中正确使用枚举参数的方法与技巧,旨在帮助开发者更高效地掌握和应用枚举类型的数据传递,适合对Spring Boot感兴趣的读者深入学习。 ... [详细]
  • 在本文中,我们将为 HelloWorld 项目添加视图组件,以确保控制器返回的视图路径能够正确映射到指定页面。这一步骤将为后续的测试和开发奠定基础。首先,我们将介绍如何配置视图解析器,以便 SpringMVC 能够识别并渲染相应的视图文件。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • Spring Boot 中配置全局文件上传路径并实现文件上传功能
    本文介绍如何在 Spring Boot 项目中配置全局文件上传路径,并通过读取配置项实现文件上传功能。通过这种方式,可以更好地管理和维护文件路径。 ... [详细]
  • 深入解析 Lifecycle 的实现原理
    本文将详细介绍 Android Jetpack 中 Lifecycle 组件的实现原理,帮助开发者更好地理解和使用 Lifecycle,避免常见的内存泄漏问题。 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 两个条件,组合控制#if($query_string~*modviewthread&t(&extra(.*)))?$)#{#set$itid$1;#rewrite^ ... [详细]
  • XAMPP 遇到 404 错误:无法找到请求的对象
    在使用 XAMPP 时遇到 404 错误,表示请求的对象未找到。通过详细分析发现,该问题可能由以下原因引起:1. `httpd-vhosts.conf` 文件中的配置路径错误;2. `public` 目录下缺少 `.htaccess` 文件。建议检查并修正这些配置,以确保服务器能够正确识别和访问所需的文件路径。 ... [详细]
author-avatar
逃跑的骨拉拉gf_761
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有