开发 Workerman WebSocket 服务器时,握手失败原因有哪些?

在使用 workerman 开发 websocket 服务器时,握手失败的原因主要包括请求头不正确、sec-websocket-key 处理错误、状态码错误和子协议及扩展处理错误。1) 请求头不正确时,检查客户端的请求头;2) sec-websocket-key 处理错误时,通过日志记录相关值来调试;3) 状态码错误时,检查服务器返回的 http 状态码;4) 子协议和扩展处理错误时,记录处理过程来调试。

开发 Workerman WebSocket 服务器时,握手失败原因有哪些?

引言

在开发 WebSocket 服务器时,握手失败是一个常见的问题,搞得我头疼了好几天。今天就来聊聊在使用 Workerman 开发 WebSocket 服务器时,握手失败的那些事儿。读完这篇文章,你将了解到握手失败的各种原因,以及如何避免这些问题,让你的 WebSocket 服务器更加稳定可靠。

基础知识回顾

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,它通过一个 HTTP 握手过程来建立连接。Workerman 是一个高性能的 PHP 框架,非常适合开发 WebSocket 服务器。在使用 Workerman 时,握手过程是通过 HTTP 请求和响应来完成的,如果这个过程出现问题,就会导致握手失败。

Workerman 提供了 onWebSocketConnect 回调函数来处理 WebSocket 连接的握手过程,这个函数是我们需要重点关注的地方。

核心概念或功能解析

WebSocket 握手过程的定义与作用

WebSocket 握手过程是客户端和服务器之间建立 WebSocket 连接的关键步骤。这个过程通过 HTTP 请求和响应来完成,客户端发送一个特殊的 HTTP 请求,服务器返回一个 HTTP 响应,如果一切正常,连接就会升级为 WebSocket 连接。

握手过程的作用是确保客户端和服务器都支持 WebSocket 协议,并且能够协商出合适的子协议和扩展。

public function onWebSocketConnect($connection, $http_response){    // 握手处理逻辑}

工作原理

在 Workerman 中,握手过程主要通过 onWebSocketConnect 函数来处理。这个函数会在客户端发送 WebSocket 握手请求时被调用,服务器需要在这个函数中验证请求头,生成正确的响应头,并通过 $http_response 对象返回给客户端。

握手过程的关键步骤包括:

验证客户端请求头中的 UpgradeConnection 字段,确保它们分别为 websocketUpgrade。验证 Sec-WebSocket-Key 字段,并生成 Sec-WebSocket-Accept 响应头。设置 HTTP 状态码为 101 Switching Protocols,并返回正确的响应头。

如果这些步骤中的任何一个出现问题,都会导致握手失败。

使用示例

基本用法

下面是一个简单的 Workerman WebSocket 服务器握手处理示例:

use WorkermanWorker;use WorkermanConnectionTcpConnection;$worker = new Worker('websocket://0.0.0.0:8080');$worker->onWebSocketConnect = function($connection, $http_response){    $connection->onWebSocketConnect = function($connection, $http_response)    {        $secWebSocketKey = $connection->header('Sec-WebSocket-Key');        $secWebSocketAccept = base64_encode(sha1($secWebSocketKey . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11', true));        $http_response->withHeader('Sec-WebSocket-Accept', $secWebSocketAccept);        $http_response->withHeader('Upgrade', 'websocket');        $http_response->withHeader('Connection', 'Upgrade');        $http_response->withStatus(101);    };};Worker::runAll();

这段代码展示了如何在 onWebSocketConnect 函数中处理 WebSocket 握手请求,生成正确的响应头,并返回给客户端。

高级用法

在实际开发中,我们可能需要处理更多的握手细节,比如支持子协议和扩展。这里是一个支持子协议的示例:

$worker->onWebSocketConnect = function($connection, $http_response){    $secWebSocketKey = $connection->header('Sec-WebSocket-Key');    $secWebSocketAccept = base64_encode(sha1($secWebSocketKey . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11', true));    $http_response->withHeader('Sec-WebSocket-Accept', $secWebSocketAccept);    $http_response->withHeader('Upgrade', 'websocket');    $http_response->withHeader('Connection', 'Upgrade');    // 处理子协议    $protocols = $connection->header('Sec-WebSocket-Protocol');    if ($protocols) {        $protocols = explode(',', $protocols);        $protocol = trim($protocols[0]);        $http_response->withHeader('Sec-WebSocket-Protocol', $protocol);    }    $http_response->withStatus(101);};

这个示例展示了如何在握手过程中处理子协议,确保客户端和服务器能够协商出合适的子协议。

因赛AIGC 因赛AIGC

因赛AIGC解决营销全链路应用场景

因赛AIGC 73 查看详情 因赛AIGC

常见错误与调试技巧

握手失败的原因有很多,以下是一些常见的错误和调试技巧:

请求头不正确:客户端发送的请求头中 UpgradeConnection 字段必须分别为 websocketUpgrade,否则服务器会拒绝握手请求。可以通过检查客户端的请求头来排查这个问题。

Sec-WebSocket-Key 处理错误:服务器需要正确处理 Sec-WebSocket-Key 字段,并生成正确的 Sec-WebSocket-Accept 响应头。如果这个过程出错,握手就会失败。可以通过日志记录 Sec-WebSocket-KeySec-WebSocket-Accept 的值来调试。

状态码错误:握手响应的状态码必须为 101 Switching Protocols,如果状态码不正确,握手也会失败。可以通过检查服务器返回的 HTTP 状态码来排查这个问题。

子协议和扩展处理错误:如果客户端请求中包含子协议或扩展,服务器需要正确处理这些字段,否则握手可能会失败。可以通过日志记录子协议和扩展的处理过程来调试。

性能优化与最佳实践

在开发 WebSocket 服务器时,握手过程的性能优化和最佳实践非常重要。以下是一些建议:

缓存 Sec-WebSocket-Accept:生成 Sec-WebSocket-Accept 是一个计算密集的过程,可以考虑将结果缓存起来,避免每次握手都重新计算。

使用异步处理:Workerman 支持异步处理,可以利用这个特性来提高握手过程的性能,避免阻塞。

日志记录和监控:在握手过程中记录详细的日志,可以帮助快速定位和解决问题。同时,监控握手失败的频率和原因,可以帮助优化服务器的性能。

代码可读性和维护性:在编写握手处理代码时,注意代码的可读性和维护性,适当添加注释和文档,方便后续的维护和调试。

总之,握手失败的原因多种多样,理解握手过程的工作原理和常见错误,可以帮助我们更好地开发和优化 WebSocket 服务器。希望这篇文章能对你有所帮助,让你的 WebSocket 服务器更加稳定可靠。

以上就是开发 Workerman WebSocket 服务器时,握手失败原因有哪些?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/282756.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月4日 17:11:33
下一篇 2025年11月4日 17:16:37

相关推荐

  • Bear 博客上的浅色/深色模式分步指南

    我最近使用偏好颜色方案媒体功能与 light-dark() 颜色函数相结合,在我的 bear 博客上实现了亮/暗模式切换。 我是这样做的。 第 1 步:设置 css css 在过去几年中获得了一些很酷的新功能,包括 light-dark() 颜色函数。此功能可让您为任何元素指定两种颜色 &#8211…

    2025年12月24日
    100
  • 什么是功能类优先的 CSS 框架?

    理解功能类优先 tailwind css 是一款功能类优先的 css 框架,用户可以通过组合功能类轻松构建设计。为了理解功能类优先,我们首先要区分语义类和功能类这两种 css 类名命名方式。 语义类 以前比较常见的 css 命名方式是根据页面中模块的功能来命名。例如: 立即学习“前端免费学习笔记(深…

    2025年12月24日
    000
  • SCSS – 增强您的 CSS 工作流程

    在本文中,我们将探索 scss (sassy css),这是一个 css 预处理器,它通过允许变量、嵌套规则、mixins、函数等来扩展 css 的功能。 scss 使 css 的编写和维护变得更加容易,尤其是对于大型项目。 1.什么是scss? scss 是 sass(syntropically …

    2025年12月24日
    000
  • css3选择器优化技巧

    CSS3 选择器优化技巧可提升网页性能:减少选择器层级,提高浏览器解析效率。避免通配符选择器,减少性能损耗。优先使用 ID 选择器,快速定位目标元素。用类选择器代替标签选择器,精确匹配。使用属性选择器,增强匹配精度。巧用伪类和伪元素,提升性能。组合多个选择器,简化代码。利用 CSS 预处理器,增强代…

    2025年12月24日
    300
  • css代码规范有哪些

    CSS 代码规范对于保持一致性、可读性和可维护性至关重要,常见的规范包括:命名约定:使用小写字母和短划线,命名特定且描述性。缩进和对齐:按特定规则缩进、对齐选择器、声明和值。属性和值顺序:遵循特定顺序排列属性和值。注释:解释复杂代码,并使用正确的语法。分号:每个声明后添加分号。大括号:左大括号前换行…

    2025年12月24日
    200
  • 利用CSS3编写类似iOS中的复选框及带开关的按钮的代码

    这篇文章主要介绍了使用css3编写类似ios中的复选框及带开关的按钮,需要的朋友可以参考下 checkbox多选 最近写了一个适合移动端的checkbox,如图: ps:中间的勾勾是iconfont,iOS风格的。 具体的HTML: 立即学习“前端免费学习笔记(深入)”; 默认未选中 默认选中 橘黄…

    2025年12月24日
    000
  • html5能否插入xml文档_html5xml嵌入与节点解析展示【攻略】

    需用JavaScript加载解析XML:一、XMLHttpRequest异步获取并解析;二、DOMParser解析内联XML字符串;三、fetch API配合DOMParser处理;四、XMLSerializer序列化调试;五、getElementsByTagNameNS处理命名空间。 如果您希望在…

    2025年12月23日
    200
  • html如何改变成HTML5_HTML升级为HTML5步骤与转换技巧【指南】

    需更新DOCTYPE为,设置lang属性,用语义化元素替代div,升级表单输入类型,以audio/video替代Flash嵌入多媒体。 如果您正在维护一个传统HTML网页,希望将其升级为符合现代标准的HTML5格式,则需要对文档结构、元素语义、语法规范及媒体支持等方面进行系统性调整。以下是将HTML…

    2025年12月23日
    000
  • HTML如何实现条件判断_JavaScript逻辑控制应用【解析】

    JavaScript提供五种条件判断方法:一、if语句基础分支;二、if-else if-else多条件选择;三、switch匹配离散值;四、三元运算符简化单层赋值;五、逻辑运算符组合复杂条件。 如果您在HTML页面中需要根据特定条件动态显示内容或执行不同操作,则必须借助JavaScript来实现逻…

    2025年12月23日
    000
  • HTML如何实现数值相加_JavaScript计算功能开发【教程】

    可通过五种JavaScript方法实现网页中多数值实时相加:一、内联事件+ID获取;二、表单submit+preventDefault;三、input事件实时计算;四、ES6箭头函数与解构;五、data属性批量处理多组。 如果您在网页中需要实现两个或多个数值的相加运算,并将结果实时显示,可以通过嵌入…

    2025年12月23日
    000
  • html5怎么加表格_HTML5用table加tr/td/th标签添加行列数据表格【添加】

    HTML5表格需用定义结构,含等标签,支持标题、rowspan/colspan合并、CSS边框及语义分组。 如果您希望在HTML5页面中创建结构化数据展示区域,则需要使用标准的表格标签来构建行列布局。以下是添加表格的具体步骤: 一、基础表格结构定义 HTML5中表格必须以 标签为容器,内部使用定义行…

    2025年12月23日
    000
  • 如何用html实现文字html_用HTML代码展示HTML文字内容【展示】

    需将HTML特殊字符转义为实体以实现代码原样显示,常用方法包括:手动实体替换、pre/code标签配合转义、JavaScript动态转义、CSS white-space控制、highlight.js语法高亮。 如果您希望在网页中直接显示HTML代码本身,而不是让浏览器解析并渲染这些代码,则需要将HT…

    2025年12月23日
    000
  • html如何写点击代码_编写HTML元素点击事件的代码【代码】

    实现HTML元素点击响应有五种方法:一、内联onclick属性;二、JavaScript获取元素后用addEventListener绑定;三、事件委托绑定到父容器;四、自定义函数配合onclick调用;五、用preventDefault和stopPropagation控制默认行为与冒泡。 如果您希望…

    2025年12月23日
    000
  • 如何提升HTML代码质量_编程规范优化指南【解析】

    HTML代码质量优化需遵循五项规范:一、正确使用语义化标签提升可访问性与SEO;二、属性值强制双引号并显式书写布尔属性;三、精简嵌套层级,统一双空格缩进;四、class/id采用kebab-case命名,强调语义与唯一性;五、必须声明DOCTYPE、lang和UTF-8编码。 如果您在编写HTML代…

    2025年12月23日
    000
  • html如何写点击代码_编写HTML元素点击事件代码【事件】

    为HTML元素添加点击响应功能有五种方法:一、内联onclick属性;二、getElementById结合addEventListener;三、事件委托;四、JavaScript中直接赋值onclick;五、结合data属性实现多态响应。 如果您希望为HTML元素添加点击响应功能,则需要通过Java…

    2025年12月23日
    200
  • HTML如何设置横向布局_Flexbox排列方法【解析】

    Flexbox通过display: flex、flex-direction: row、justify-content、flex-wrap: nowrap及子项flex属性实现元素横向排列。 如果您希望在HTML页面中实现元素的横向排列,Flexbox提供了一种简洁且强大的布局方式。以下是实现横向布局…

    2025年12月23日
    000
  • c语言如何生成html_用C语言程序输出HTML格式文件【文件】

    C语言动态生成HTML文件有五种方法:一、用fprintf逐行写入;二、构建缓冲区后fwrite一次性写入;三、用宏简化标签输出;四、从模板文件加载并替换变量;五、用结构体组织元素并序列化。 如果您希望使用C语言程序动态生成HTML格式的文件,则需要通过标准文件I/O操作将符合HTML语法的文本内容…

    2025年12月23日
    000
  • HTML如何实现图像替换_图文切换技术解析【方法】

    实现图像与文字动态切换有五种方法:一、CSS伪元素与属性选择器;二、JavaScript动态innerHTML替换;三、CSS类名切换配合display控制;四、picture元素响应式切换;五、Canvas绘制切换。 如果您希望在网页中实现图像与文字内容的动态切换,例如点击按钮后图片变为文字描述,…

    2025年12月23日
    000
  • html如何表格_创建HTML数据表格并设置样式【设置】

    HTML表格通过table、tr、td构建基础结构,用th和thead/tbody实现语义化表头,CSS控制边框、尺寸、对齐及类名复用样式。 如果您需要在网页中展示结构化数据,HTML表格是实现这一目标的基础方式。以下是创建HTML数据表格并设置样式的具体步骤: 一、使用table、tr、td标签构…

    2025年12月23日
    000
  • html如何空一段距离_在HTML元素间创建空白距离【空白】

    可通过margin、padding、空元素、br标签或CSS类五种方式控制HTML元素间距:margin设外边距,padding设内边距,空元素设高度,br强制换行,CSS类统一管理。 如果您希望在HTML元素之间创建空白距离,可以通过多种方式控制元素间的垂直或水平间距。以下是实现此效果的具体方法:…

    2025年12月23日
    000

发表回复

登录后才能评论
关注微信