swoft框架之websocket服务的简单使用

本篇博文相关环境版本如下:

OS系统:CentOS Linux release 7.7

php版本:PHP 7.2.24 

swoole版本:4.4.14

swoft版本:2.0.7

swoft框架的介绍及安装

......忽略N多字,可自行移步至官网了解。

我这里已经整合了相关目录,自行下载解压上传到服务器即可。

本文所使用的的swoft整合目录文件:swoft-chat.zip

启动swoft服务

将解压的项目上传到服务器,并进入项目根目录,执行如下命令:

php ./bin/swoft ws:start  #这个就是表示启动swoft的websocket服务

php ./bin/swoft -h #查看swoft文件的更多使用帮助命令


成功启动后的示例截图如下:

sw1.png

上图中可以看到服务启动成功,并监听的端口是:18308


用工具来测试连接上服务端:http://www.easyswoole.com/wstool.html


在打开的页面中输入websocket服务地址:ws://ip:18308/commun 然后点击 开启连接。注意:这里会连接到app/WebSocket/Controller/CommunController.php文件中,也就是说接下来client基于websocket协议发送数据到服务端的时候,服务端都是通过app/WebSocket/Controller/CommunController.php进行相关逻辑处理的。


示例截图如下:

sw2.png



为什么 ws://ip:端口/commun会让app/WebSocket/Controller/CommunController.php文件进行处理?

答:需要了解swoft框架的注解机制,了解了就知道了为啥会让这个文件进行处理了


连接上之后,接下来就可以在输入框中发送text、json等格式的数据类型给服务端了,服务端会在app/WebSocket/Controller/CommunController.php文件中的onMessage方法中接收到,然后服务端就可以在该方法里面进行相应的逻辑处理了。


示例截图如下:

sw3.png


为什么client端可以直接发送text、json等格式的数据类型给服务端,而服务端不需要像easyswoole那样一样,需要单独写一个消息解析类文件,进行解析?

答:swoft底层已经内置了text、json等消息解析处理,底层已经封装好了,只需要按照规范发送即可。


当client和服务端断开连接,会触发onClose方法,不过app/WebSocket/Controller/CommunController.php文件中没有该方法,有需要的可以自行添加上。


swoft框架的websocket服务简单使用示例告一段落。


swoft框架属于重量级框架,因为该框架偏向于java中的SpringBoot,所以swoft才引入了注解机制,注解是swoft框架中的重点,如果不明白注解机制,那swoft框架就学不会,可以说swoft里的一切都基于注解。easyswoole属于轻量级框架。

附一张swoft框架的websocket服务 连接的处理流程(来自官网)

sw1.png

尾声

1、使用swoft框架必须了解注解机制,不然没有办法基于swoft进行开发的。


2、必须了解Swoft CLI,它是基于Swoft 2.0框架构建的应用,运行时同样需要安装Swoole,用该工具可以用来创建controller、model、middleware(中间件)等。如果你是基于swoft框架进行开发,那么建议使用该工具进行生成controller等文件,如果你人工复制的其它文件,对应的注解你不一定能改正确。我提供的文件中已经安装好了该工具(即 根目录中的swoftcli.phar文件),可以在项目根目录中执行:

php swoftcli.phar -h  #查看swoftcli.phar文件中的帮助命令

php swoftcli.phar gen -h #查看swoftcli.phar文件中的gen命令的使用帮助

......


3、如果你在swoft中修改了代码,那你使用reload(这里以websocket服务为例:php ./bin/swoft ws:reload)后,会发现修改的代码并没有生效,且reload之前 客户端和服务端建立的连接都失效了 但是 和客户端并没有断开连接。。reload之后用reload之前的客户端给服务端发送数据,swoft会提示该连接:session information has been lost of the SID: fd(意思就是:SID: fd的会话信息丢失了),也就是说 reload之后,不仅不会热加载你修改的代码到内存。。还会让reload之前已经和服务端连接的都失效。。关于这个问题,已经和官方确认过了,官方回复 确实是这样的(截至目前为止,这个swoft版本是这样的,不知道后续官方会不会修改下这个reload命令)。。嗯。。或者说 swoft现在的设计就是完全重启的机制(修改代码后 必须重启swoft服务才能让修改的代码生效)。。顺便说一句  easyswoole就不存在该问题。


4、由于上面说的第三点,修改代码导致reload服务后,新代码依然不起作用的原因,对开发阶段来说是很难受的,极大的不方便开发调试,官方提供的Swoft CLI命令行工具有一个serve命令用来启动swoft服务并监视文件更改以重新启动swoft服务。也就是说使用swoft在开发阶段为了方便调试,可以使用官方的Swoft CLI工具中的serve命令来启动swoft服务,这种方式启动的swoft服务的话,swoft会监视文件,如果监视到有文件更新,会自动帮我们重新启动swoft服务,这样就间接的实现代码热更新了。


Swoft CLI的serve命令使用示例如下:

php swoftcli.phar serve -h  #查看swoftcli.phar工具中的serve命令的使用帮助

php swoftcli.phar serve:run -h #查看swoftcli.phar工具中的serve:run命令的使用帮助

php swoftcli.phar serve:run #使用swoftcli.phar工具来启动swoft服务,并对文件进行监视,监视到文件有更改的话,则重启swoft服务,该命令默认启动的是http和rpc服务

php swoftcli.phar serve:run -c ws:start #使用swoftcli.phar工具来启动swoft中的websocket服务,并对文件进行监视,然后xxxxxxxx你懂的。。

Swoft的其它命令行姿势

php bin/swoft app:bean  #使用这个命令 可以看到加载注册成功的bean(比如你创建了一个监听器类文件 但是总是触发不了对应的事件 就可以使用该命令查看该监听器类文件是否已经被加载到)


更多细节及开发说明请移步至 Swoft官网文档(2.0版本文档)    Swoft国外官方文档中文版(2.0版本文档)


推荐:easyswoole框架之websocket服务的简单使用



你是我温暖的手套冰冷的啤酒带着阳光味道的衬衫 还有日复一日的梦想    -->恋爱的犀牛【廖一梅】



声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。

小周博客
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

精彩评论

全部回复 0人评论 7,777人参与

loading