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



推荐阅读
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 本文详细介绍 Go+ 编程语言中的上下文处理机制,涵盖其基本概念、关键方法及应用场景。Go+ 是一门结合了 Go 的高效工程开发特性和 Python 数据科学功能的编程语言。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 深入解析JVM垃圾收集器
    本文基于《深入理解Java虚拟机:JVM高级特性与最佳实践》第二版,详细探讨了JVM中不同类型的垃圾收集器及其工作原理。通过介绍各种垃圾收集器的特性和应用场景,帮助读者更好地理解和优化JVM内存管理。 ... [详细]
  • Windows服务与数据库交互问题解析
    本文探讨了在Windows 10(64位)环境下开发的Windows服务,旨在定期向本地MS SQL Server (v.11)插入记录。尽管服务已成功安装并运行,但记录并未正确插入。我们将详细分析可能的原因及解决方案。 ... [详细]
  • 本文详细介绍如何使用arm-eabi-gdb调试Android平台上的C/C++程序。通过具体步骤和实用技巧,帮助开发者更高效地进行调试工作。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本题探讨了一种字符串变换方法,旨在判断两个给定的字符串是否可以通过特定的字母替换和位置交换操作相互转换。核心在于找到这些变换中的不变量,从而确定转换的可能性。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 将Web服务部署到Tomcat
    本文介绍了如何在JDeveloper 12c中创建一个Java项目,并将其打包为Web服务,然后部署到Tomcat服务器。内容涵盖从项目创建、编写Web服务代码、配置相关XML文件到最终的本地部署和验证。 ... [详细]
  • 本文探讨了在不使用服务器控件的情况下,如何通过多种方法获取并修改页面中的HTML元素值。除了常见的AJAX方式,还介绍了其他可行的技术方案。 ... [详细]
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社区 版权所有