问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

swoole websocket怎么处理$frame

发布网友 发布时间:2022-04-06 00:20

我来回答

2个回答

懂视网 时间:2022-04-06 04:41

什么是 WebSocket

WebSocket 协议是基于 TCP 的一种新的网络协议,使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

为什么需要 WebSocket

因为 HTTP 的通信只能由客户端发起。

WebSocket有哪些特点

  • 建立在TCP协议之上的

  • 性能开销小,通信高效

  • 客户端可以与任意的服务器进行通信

  • 协议标识:ws、wss

  • 持久化网络通信协议

  • WebSocket 使用场景

    社交聊天、弹幕、多玩家游戏、协同编辑、股票基金实时报价、体育实况更新、视频会议聊天、基于位置的应用、在线教育等需要高实时性的运用场景。

    在 WebSocket 之前,传统方式我们想要做聊天程序,可能会使用 JavaScript 定时器,每隔一秒钟发送一次 HTTP 请求到服务器,查询有没有新消息。

    有了 WebSocket ,客户端通过浏览器以 HTTP 方式向服务端发送 WebSocket 连接请求,然后服务器发出回应,这个过程通常称为“握手” 。浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道,将协议升级为 WebSocket,有新消息的话,服务端主动将消息推送给客户端。

    SocketIO 又是什么

    WebSocket 是 HTML5 最新提出的规范,虽然主流浏览器都已经支持,但仍然可能有不兼容的情况,为了兼容所有浏览器,给程序员提供一致的编程体验, SocketIO 将 WebSocket 、AJAX 和其它的通信方式全部封装成了统一的通信接口,也就是说,我们在使用 SocketIO 时,不用担心兼容问题,底层会自动选用最佳的通信方式。因此说,WebSocket 是 SocketIO 的一个子集,Think-Swoole 中是按照 SocketIO 进行解析发送到服务端的数据。

    在 ThinkPHP 6 中开启 WebSocket 服务

    1、配置文件 config/swoole.php 中“websocket. enable”设置为 true。

    2、创建监听事件,创建WsConnect、WsClose、WsTest(这个可任意命名,和客户端须对应起来),在项目根目录分别输入如下命令:

    php think make:listener WsConnect
    php think make:listener WsClose
    php think make:listener WsTest

    app/listener 目录下会生成刚才创建的监听类文件,在对应的事件类中可写入业务逻辑。我们这里先打印 $event 这个变量。Connect 事件中的 $event 是 appRequest 请求对象,Test自定义消息接收事件的 $event 是客户端发送过来的消息。

    3、在 app/event.php 中的数组 listen 键中定义事件监听类:

    app/event.php
    'listen' => [
     'AppInit' => [],
     'HttpRun' => [],
     'HttpEnd' => [],
     'LogLevel' => [],
     'LogWrite' => [],
     //监听连接,swoole 事件必须以 swoole 开头
     'swoole.websocket.Connect' => [
      applistenerWsConnect::class
     ],
     //监听关闭
     'swoole.websocket.Close' => [
      applistenerWsClose::class
     ],
     //监听 Test 场景
     'swoole.websocket.Test' => [
      applistenerWsTest::class
     ],
     ],

    swoole.websocket.Connect:客户端与服务器建立连接并完成握手事件,即 Swoole 中的 onOpen 事件。在这里记录你自己程序用户与客户端的连接ID(fd)等。非必须,建议定义。

    swoole.websocket.Close:客户端连接关闭事件,非必须。

    swoole.websocket.Test:自定义的 Test 事件;用于接收客户端发送的 test 事件的消息。一个项目中可以定义多个 Test 事件,例如聊天、定位、客服功能事件,则可对应为 Test1、Test2、Test3等。

    WebSocket 的事件也可以在 config/swoole.php 配置文件的“websocket. listen”进行配置:

    'listen' => [
     // 首字母大小写都可以;值应该是字符串非数组
     'connect' => 'applistenerWsConnect',
     'close' => 'applistenerWsClose',
     'test' => 'applistenerWsTest'
    ],

    4、项目根目录开启服务:php think swoole start 即可,底层会自动判断当前请求是 HTTP 还是 WebSocket。

    客户端与服务端建立连接

    现在我们做一个 HTML 页面,通过 HTML5 WebSocket 向我们的服务器端建立连接。在任意地方新建 test.html,内容如下:

    <!DOCTYPE HTML>
    <html>
    <head>
     <meta charset="UTF-8">
     <title>Document</title>
    </head>
    <body>
    
    消息:<input type="text" id="message">
    接收者:<input type="text" id="to">
    <button onclick="send()">发送</button>
    <script>
     var ws = new WebSocket("ws://127.0.0.1:9501/");
     ws.onopen = function(){
     console.log('连接成功');
     }
     ws.onmessage = function(data){
     console.log(data);
     }
     ws.onclose = function(){
     console.log('连接断开');
     }
     function send()
    {
     var message = document.getElementById('message').value;
     var to = document.getElementById('to').value;
     console.log("准备给" + to + "发送数据:" + message);
     ws.send(JSON.stringify(['test',{
      //这里可以自己定义属性
      to:to,
      message:message
     }])); //发送的数据必须是 "['test',数据]" 这种格式
     }
    </script>
    </body>
    </html>

    HTML5 WebSocket 有关介绍,可以访问这里进行学习。

    前端代码中 var ws = new WebSocket("ws://127.0.0.1:9501/"); 我的服务器是在本地,swoole.php 配置文件中配置的端口号是 9501,所以访问127.0.0.1:9501,ws 是 WebSocket 协议,与 HTTP、HTTPS 一样,它有 WS 和 WSS 协议。ws.onmessage 可以接受消息。

    接下来通过浏览器访问这个 HTML 页面,并打开浏览器调试控制台,可以看到连接成功的字样,以及服务端打印出来的参数:

    2b235a69fcf61064d0198068dddf2c5.png

    然后我们在刚才创建的 HTML 页面的输入框中发送消息,控制台中打印出了我们的信息:

    562540da341607e0948370fdd3eb9d6.png

    Swoole 监听服务终端中,也收到了我们发送过来的消息:

    fc0f82d0d7d28e88f60c714e68ec9f0.png

    这是因为我们在 app/listener/WsTest 打印了 $event 变量。

    最后说明一下前端页面中 ws.send(JSON.stringify(['test',{to:to,message:message}])); 这段代码,JSON.stringify() 的作用是将 JavaScript 对象转换为 JSON 字符串,to 和 message 属性是我们自定义的,test 是后端定义的 Test 事件,这个名称一定和后端对应起来。由于think-swoole中是按照 SocketIO 进行解析发送过来的数据,所以你发送的数据应该是 “[‘事件名’, 真正要发送的数据]” 的字符串形式:第一个参数的 test 就是对应服务器端的Test 事件,用于区分更多场景的实时通信逻辑业务;第二个参数才是你真正发送的数据,可以是字符串、数据、对象,服务器端 $event 参数获取的就是它。

    热心网友 时间:2022-04-06 01:49

    如果突然断掉,error和close会被触发。你可以在事件触发之后重新去打开链接。也可以使用setTimeout(foo, 10000);延时之后重新连接
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    梦幻西游怎样查看自己怎么加的属性点阿? 我好长时间没玩了 .. 怎么... 梦幻西游怎么查看我各项加了多少点 卤肉料的配方 卤肉上色最好的配方前十 三国中曹操有几个儿子 曹植的意思是什么 曹操有多少个儿子?其中姓名叫什么? 简谱中1=c2/4是什么意思?别说几节几拍我不知道节和拍是什么意思 简谱四分之二什么意思 ...是鸡膏吗 放在老汤里行吗 怎么才能容于水 谢谢 怎么使用? swoole中如何用http server接收数据,然后立即通知websocket 发送数据 《PHP与MySQL程序设计(第4版)》epub下载在线阅读,求百度网盘云资源 模板和PHP分离技术到底好在哪里?我并不觉得方便,有点疑惑。 对Servlet技术与CGI、ASP、PHP、JSP等动态网页技术进行具体的比较。 我学计算机类专业的,目前会基础的数据库和php开发,ps和ae,但目前对自己将来的就业很模糊 phpwind和discuz哪个好 推荐Web前端技术+php服务器端web开发相关的综合书籍。 php实现路由器管理功能, 应该需要什么相关技术,实现流程是什么? asp,jsp,php哪种技术比较有前途类? PHP语言是什么? 哪位大侠有关于这方面的比较好的资料介绍一下! 有哪些 PHP 的技术博客值得推荐 PHP技术分享可以讲哪 公司PHP技术分享会,该讲些什么? 电脑蓝屏错误代码0xoooooooA (0xoooooooo,0xoooooo1c,0xooooooo1,0x804fdc5d) 蓝屏码:stop:0xooooood3,(ox85e7ffec,0xooooooo2,0x00000001,ox844e77o)要怎么办? 蓝屏显示***STOP:0X0000000A(0X0162CE22,0X0000001C,0XOOOOOOO1,0X80829DE1)是指什么 xp系统蓝屏报错 0x0ooooooea 相关文件 watchdog.sys 是什么原因引起的?怎么解决? 华硕X1600蓝屏怎么办啊 代码STOP;0XOOOOOOO1 电脑重做完系统还是蓝屏提示有0xooooood文件丢失谢谢了 蓝屏停机代码0xoooooodi(0x00000006,0x00000002,0x0000000,oxb9e3d7d4)什么意思 用swoole做websocket,怎么实现数据断点续传 如何将thinkphp与swoole集成在一起 如何提高服务器并发处理能力 如何提高网站并发访问性能 PHP软件开发中如何提高项目的运行效率 php 如何在多核服务器上发挥性能 php是解释语言,有什么方法提高php的运行速度 phpstudy 用作服务器的php环境,请问能承受住大数据的并发性访问呢?该怎样优化? 如何使windows的php+nginx响应更快速 LAMP下,动态请求并发为1000每秒,php-fpm最大进程数如何设置 如何用 Laravel 发送邮件 Laravel如何发送表格邮件逖 laravel发送邮件,mail:send方式,出现一个问题,求助,贴图如下 laravel发送邮件怎么自定义邮件标题 laravel发送邮件&quot;Invalid ID given &lt;67e72f21a23ae3b0bac504d418b5875a@-&gt;&quot; laravel 有几种邮件组件 Laravel 的邮件发送队列可以指定超时时间吗 laravel 用户注册成功,发送激活邮件,时间很慢,怎么才能减少发送时间 Laravel5里的Session怎么调用 软件工程师面试时,HR都会问些什么问题