热门标签 | 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



推荐阅读
  • 本文探讨如何利用Java反射技术来模拟Webwork框架中的URL解析过程。通过这一实践,读者可以更好地理解Webwork及其后续版本Struts2的工作原理,尤其是它们在MVC架构下的角色。 ... [详细]
  • 本文探讨了如何在Node.js环境中,通过Tor网络使用的SOCKS5代理执行HTTP请求。文中不仅提供了基础的实现方法,还介绍了几种常用的库和工具,帮助开发者解决遇到的问题。 ... [详细]
  • EasyMock实战指南
    本文介绍了如何使用EasyMock进行单元测试,特别是当测试对象的合作者依赖于外部资源或尚未实现时。通过具体的示例,展示了EasyMock在模拟对象行为方面的强大功能。 ... [详细]
  • 本文详细介绍了如何正确安装Java EE SDK,并解决在安装过程中可能遇到的问题,特别是关于servlet代码在Apache Tomcat 10中无法运行的情况。 ... [详细]
  • 本文介绍如何在Windows Forms应用程序中使用C#实现DataGridView的多列排序功能,包括升序和降序排序。 ... [详细]
  • 本文探讨了浏览器的同源策略限制及其对 AJAX 请求的影响,并详细介绍了如何在 Spring Boot 应用中优雅地处理跨域请求,特别是当请求包含自定义 Headers 时的解决方案。 ... [详细]
  • 详细指南:使用IntelliJ IDEA构建多模块Maven项目
    本文在前两篇文章的基础上,进一步指导读者如何在IntelliJ IDEA中创建和配置多模块Maven项目。通过详细的步骤说明,帮助读者掌握项目模块化管理的方法。 ... [详细]
  • 探索Squid反向代理中的远程代码执行漏洞
    本文深入探讨了在网站渗透测试过程中发现的Squid反向代理系统中存在的远程代码执行漏洞,旨在帮助网站管理者和开发者了解此类漏洞的危害及防范措施。 ... [详细]
  • Microsoft即将发布WPF/E的CTP(Community Technology Preview)和SDK,标志着RIA(Rich Internet Application)技术的新里程碑。更多详情及下载链接请参见MSDN官方页面。 ... [详细]
  • Canvas漫游:碰撞检测与动画模拟
    探索Canvas在Web开发中的应用,通过碰撞检测与动画模拟提升交互体验。 ... [详细]
  • Node.js 入门指南(一)
    本文介绍了Node.js的安装步骤、如何创建第一个应用程序、NPM的基本使用以及处理回调函数的方法。通过实际操作示例,帮助初学者快速掌握Node.js的基础知识。 ... [详细]
  • Java Servlet中获取客户端IP与MAC地址的方法
    本文介绍了一种在Java Servlet应用中获取客户端IP地址及MAC地址的技术实现方法,通过示例代码详细解析了获取过程中的关键步骤和技术点。 ... [详细]
  • 本文探讨了使用Filter作为控制器的优势,以及Servlet与Filter之间的主要差异。同时,详细解析了Servlet的工作流程及其生命周期,以及ServletConfig与ServletContext的区别与应用场景。 ... [详细]
  • 本文将介绍如何利用Python爬虫技术抓取国内主流在线学习平台的数据,并以51CTO学院为例,进行详细的技术解析和实践操作。 ... [详细]
  • Spring Security核心概念与应用实践
    本文详细介绍了Spring Security的核心机制,包括其作为一系列过滤器的工作原理,如何实现用户认证与授权,以及常见的配置方法和高级特性如CSRF防护。 ... [详细]
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社区 版权所有