文章来自:laravel学院

WebSocket 概述

在此之前,有必要对 WebSocket 的原理做简单的说明,WebSocket 复用了 HTTP 协议来实现握手,然后通过请求报文中的 Upgrade 字段将 HTTP 协议升级到 WebSocket 协议来建立 WebSocket 通信连接,一旦 WebSocket 连接建立之后,就可以在这个长连接上通过 WebSocket 数据帧进行双向通信,客户端和服务端可以在任何时候向对方发送报文,而不是 HTTP 协议那种服务端只有在客户端发起请求后才能响应,从而解决了在 Web 页面实时显示最新资源的问题。

与 HTTP 类似,WebSocket 协议对应的 scheme 是 ws,如果是加密的 WebSocket 对应的 scheme 是 wss。

在这篇教程中,我们将在服务端基于 Swoole 实现简单的 WebSocket 服务器,然后在客户端基于 JavaScript 实现 WebSocket 客户端。

WebSocket 服务器

PHP 异步网络通信引擎 Swoole 内置了对 WebSocket 的支持,通过几行 PHP 代码就可以写出一个异步非阻塞多进程的 WebSocket 服务器:

on('open', function (SwooleWebSocketServer $server, $request) { echo "server: handshake success with fd{$request->fd}";});// 收到消息时触发推送$server->on('message', function (SwooleWebSocketServer $server, $frame) { echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}"; $server->push($frame->fd, "this is server");});// 关闭 WebSocket 连接时触发$server->on('close', function ($ser, $fd) { echo "client {$fd} closed";});// 启动 WebSocket 服务器$server->start();

编写完成后,将这段 PHP 代码保存到本地 websocket_server.php 文件。

WebSocket 客户端

在客户端,可以通过 JavaScript 调用浏览器内置的 WebSocket API 实现 WebSocket 客户端,实现代码和服务端差不多,无论服务端还是客户端 WebSocket 都是通过事件驱动的,我们在一个 HTML 文档中引入相应的 JavaScript 代码:

  Chat Client

将这个 HTML 文档命名为 websocket_client.html

WebSocket 通信演示

接下来,我们在命令行启动 WebSocket 服务器:

php websocket.php

然后在浏览器中访问 websocket_client.html,首先会提示我们输入昵称:

输入之后点击确定,JavaScript 代码会继续往下执行,让输入框获取焦点,然后初始化 WebSocket 客户端并连接到服务器,这个时候通过开发者工具可以看到 Console 标签页已经输出了连接已建立日志:

在 Network 里面也可以看到 WebSocket 握手请求和响应:

这个时候我们在输入框中输入「你好,WebSocket!」并回车,即可触发客户端发送该数据到服务器,服务器接收到消息后会将其显示出来:

同时将「This is server」消息推送给客户端,客户端通过 onmessage 回调函数将获取到的数据显示出来。在开发者工具的 Network->WS 标签页可以查看 WebSocket 通信细节:

看起来,这个过程还是客户端触发服务器执行推送操作,但实际上,在建立连接并获取到这个客户端的唯一标识后,后续服务端资源有更新的情况下,仍然可以通过这个标识主动将更新推送给客户端,而不需要客户端发起拉取请求。WebSocket 服务器和客户端在实际项目中的实现可能会更加复杂,但是基本原理是一致的。

hbuilderx内置服务器启动失败_我们来看看Swoole是如何实现WebSocket服务器及客户端的...相关推荐

  1. websocket 更新点位 浏览器卡顿_我们来看看Swoole是如何实现WebSocket服务器及客户端的...

    php自学中心 2019-11-08 10:25:30 文章来自:laravel学院WebSocket 概述 在此之前,有必要对 WebSocket 的原理做简单的说明,WebSocket 复用了 H ...

  2. win7计算机不支持此接口,win7系统IIS服务器启动失败显示不支持此接口的解决方法...

    很多小伙伴都遇到过 出错表现为以下几点: 1.World Wide Web Publishing 服务在请求配置数据库更改通知时遇到问题.数据域包含错误号. 2.初始化 World Wide Web ...

  3. windows10服务器运行失败,win10遇到服务器启动失败 80端口被占用如何解决

    Win10提示"服务器启动失败,80端口被占用"怎么办?具体解决方法如下 步骤如下: 1.以管理员身份运行cmd; 2.输入:net stop http 注:如果提示是否真的需要停 ...

  4. 内置MRE启动后不在IDLE显示

    问题:内置MRE启动后不在IDLE显示 回答:从我们这边分析,这个项目因为开关机没有动画(静态GIF图),开机时间比较短,MRE没有初始化完成,导致某些文件没有写入NV,开关机后也没有再写过,导致MR ...

  5. SpringBoot内置Tomcat启动不了的原因

    SpringBoot内置Tomcat启动不了的原因: 1.需要加入spring-boot-starter-web依赖 [web中集成了tomcat.dispatcherServlet.xml-] &l ...

  6. Tomcat服务器启动失败的原因

    Tomcat1.Tomcat服务器启动失败的原因 忘记配置JAVA_HOME.因为tomcat是用java实现的,运行时至少需要JRE环境,否则报错 JAVA_HOME写错了.即使你有JDK环境,to ...

  7. r420服务器故障维修,DELL R420 OMSA IPMI 服务器启动失败

    DELL R420 OMSA IPMI 服务器启动失败. /opt/dell/srvadmin/sbin/srvadmin-services.sh start Starting Systems Man ...

  8. MySQL 服务正在启动,系统错误,服务器启动失败 1607解决办法

    1.如图数据库已经安装成功 2.在net start mysql语句发现服务器启动失败,错误代码1607,检查my.ini 文件里面的basedir=D:\mysql-5.7.21-winx64和da ...

  9. hbuilderx内置服务器启动失败_Nginx服务器简介与配置

    一.Nginx简介 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,Nginx代码完全用C语言从头写成,已经移植到许多体系结构和操作系统.在连接高并发的情况下,Ngin ...

最新文章

  1. 2022-2028年中国硅质原料行业全景调研及投资前景展望报告
  2. MySQL面试题 | 附答案解析(三)
  3. 全球著名音乐抓轨软件EAC 设置详解
  4. BZOJ 2037 Sue的小球
  5. android viewpager动态加载页面,Android viewpager中动态添加view并实现伪无限循环的方法...
  6. xp,win7,win2003,win2008常用命令集
  7. OS / 进程中某个线程崩溃,是否会对其他线程造成影响?
  8. 二面京东,面试官直接问我JVM,我心里一阵暗爽~
  9. 工作108:vue里面wangEdit编辑器使用
  10. PHP笔记-打印99乘法表例子
  11. ibatis resultclass java.util.list_mybatis 动态sql返回一个List封装类报错求解决方法
  12. 移动端照片上传、头像裁剪完整功能,兼容iphone,android (一)
  13. html5编写商城页面,HTML5+CSS3前端入门教程---从0开始通过一个商城实例手把手教你学习PC端和移动端页面开发第2章HTML基础知识...
  14. docker swarm英文文档学习-11-上锁你的集群来保护你的加密密钥
  15. lammps教程:real和metal单位下能量转换公式
  16. 每次循环都会创建新的数组,导致内存占用过多
  17. 天线接口 IPEX接口 SMA接口 U.FL、IPX 天线的工作原理 天线的种类
  18. 什么是双活数据中心 ?双活数据中心有哪些优点​?
  19. java版我的世界光追,光追有多神奇?我的世界VS别人的世界
  20. 1分钟学会便捷绘制跨职能流程图

热门文章

  1. java交换数组元素_交换数组中的元素(Java)
  2. 加入域时出现以下错误 登陆失败 该目标账户名称不正确_微信支付踩坑合集:微信小程序支付失败是什么原因?持续更新...
  3. cad 打开硬件加速卡_老司机手把手带你解决,各种CAD疑难杂症
  4. php mongo 类,mongo php类
  5. html 自定义属性_重学前端基础:属性操作,重点getAttribute / setAttribute方法
  6. 微型计算机的分类有,微型计算机的种类很多,主要分为台式机,笔记本,还有什么...
  7. Java 算法 旅行家的预算
  8. Java 蓝桥杯 芯片测试
  9. java统计数据并导出Excel
  10. TCA9548A iic地址扩展器件 树莓派JAVA版教程