热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

phpsocket持久连接,WebSocket原理和如何实现持久连接

HTTP协议HTTP协议是基于TCP协议的应用层协议。HTTP协议的工作模式是requestresponse模式。在一次通信中,必须首先由client向server发

HTTP协议

HTTP协议是基于TCP协议的应用层协议。HTTP协议的工作模式是request/response模式。在一次通信中,必须首先由client向server发起TCP连接,然后server接受该TCP连接请求,在TCP连接建立之后,首先由client发起HTTP request,然后server再发出HTTP response。

问题:Server不允许发送TCP请求。也就是说明Server没有收到request的情况下,没把发发送response给客户端。

解决方法:

1、多个HTTP请求不断发出。如Ajax轮询,浏览器每隔几秒就问下服务器是否还有新的消息。随之而来的问题占用服务器资源。

2、long poll 跟Ajax轮询差不多的。采取的是阻塞模式。没有收到服务器端的响应,就一直不返回Response给客户端。这点感觉好像个孩子。看到好玩的好吃的话,一定要到手,否则就哭着不走。哈哈… 带来的问题就是需要很高的并发。

WebSocket

WebSocket是Html5新的协议。借用了HTTP的协议来完成一部分握手。实现了浏览器与服务器全双工通信。HTTP协议建立在TCP协议之上的,当进行HTTP通信时候,Client和Server之间已经建立起了一个TCP连接,而任何TCP连接都是可以用来双向通信的,所以我们就可以利用这个现成的TCP连接来实现Client和Server的双向通信。

WebSocket连接如何建立

Step 1 建立TCP连接(这一步是一切的基础,和HTTP一样)

Step 2 通过TCP连接,发送HTTP Get 请求,其中包含关键的Upgrade: websocket header。

Step 3 Server收到HTTP请求后,会把Step 1的TCP连接的用户层协议从HTTP转变为WebSocket。至此,HTTP部分就退出舞台了,WebSocket开始接管一切。

借用Wikipedia,来看一个典型的Websocket握手

b2e6e0dd139aa9d5bad57aa1582ec1cd.png

红色框中的就是WebSocket的核心了。告诉应用服务器我发起的请求是WebSocket。抓紧帮我处理掉。

Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== //Base64 encode的值验证是否真的Websocket的

Sec-WebSocket-Protocol: chat, superchat  //用户定义的字符串,用来区分同URL下,不同的服务所需要的协议

Sec-WebSocket-Version: 13  //告诉服务器所使用的Websocket Draft(协议版本)

服务器返回如下,接受到请求, 成功建立Websocket。

b9d42ca953c8066d1528aff80f2decbd.png

Sec-WebSocket-Accept 这个则是经过服务器确认,并且加密过后的 Sec-WebSocket-Key。Sec-WebSocket-Protocol 则是表示最终使用的协议。

总结WebSocket解决的问题

1、解决了HTTP协议的被动性,当服务器完成协议升级后(HTTP->Websocket),服务端就可以主动推送信息给客户端啦。

2、解决了Ajax轮询和long poll 同步有延迟,而且还非常消耗资源。

PS:最近学习了好多的偏底层的知识,因为在学习Swoole的时候,没有点底层的知识,无法理解Swoole。如果只是建立在使用Swoole的情况下,出现问题,根本不知道如何解决。

学习链接:



推荐阅读
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • 使用圣杯布局模式实现网站首页的内容布局
    本文介绍了使用圣杯布局模式实现网站首页的内容布局的方法,包括HTML部分代码和实例。同时还提供了公司新闻、最新产品、关于我们、联系我们等页面的布局示例。商品展示区包括了车里子和农家生态土鸡蛋等产品的价格信息。 ... [详细]
  • .NetCoreWebApi生成Swagger接口文档的使用方法
    本文介绍了使用.NetCoreWebApi生成Swagger接口文档的方法,并详细说明了Swagger的定义和功能。通过使用Swagger,可以实现接口和服务的可视化,方便测试人员进行接口测试。同时,还提供了Github链接和具体的步骤,包括创建WebApi工程、引入swagger的包、配置XML文档文件和跨域处理。通过本文,读者可以了解到如何使用Swagger生成接口文档,并加深对Swagger的理解。 ... [详细]
  • 数据库锁的分类和应用
    本文介绍了数据库锁的分类和应用,包括并发控制中的读-读、写-写、读-写/写-读操作的问题,以及不同的锁类型和粒度分类。同时还介绍了死锁的产生和避免方法,并详细解释了MVCC的原理以及如何解决幻读的问题。最后,给出了一些使用数据库锁的实际场景和建议。 ... [详细]
  • 本文分享了一位Android开发者多年来对于Android开发所需掌握的技能的笔记,包括架构师基础、高级UI开源框架、Android Framework开发、性能优化、音视频精编源码解析、Flutter学习进阶、微信小程序开发以及百大框架源码解读等方面的知识。文章强调了技术栈和布局的重要性,鼓励开发者做好学习规划和技术布局,以提升自己的竞争力和市场价值。 ... [详细]
author-avatar
117942101-brsh
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有