`
阅读更多
WebSocket 由来已久, 常用于 "服务器推" 场景。最近开始学习 WebSocket (从 tomcat examples 开始), 本文的主要目的是做学习笔记, 同时记录一份开发指南。

    本文示例代码见: https://github.com/hanyong/exercise/tree/websocket

HTTP 协议简述
我们先来看看 HTTP。

一次 HTTP 请求过程如下:

客户端 服务器
1. 客户端建立到服务器的 TCP 连接
2. 客户端发送请求
3. 客户端等待响应
4. 服务器收到请求
5. 服务器发送响应
6. 客户端收到响应
7. 请求结束
TCP 连接是支持双向同时读写的全双工协议, 但是我们看传统的 HTTP 协议有几个问题:

请求过程是串行的, 客户端与服务器互相等待.
请求是单向的, 总是必须客户端先发起请求.
也就是说, 传统的 HTTP 1.0/1.1 协议没有充分利用 TCP 连接的能力.

HTTP 协议是无状态的, 两个请求是从同一个 TCP 连接发过来, 还是从不同的 TCP 连接发过来, 对服务器来说应该是等价的.
    HTTP 协议这样的设计主要是简化了编程模型, 想一想传统的 CGI 脚本, 一个脚本只要能够接受输入, 产生输出, 就可以提供 web 服务。HTTP 协议缺少 ISO 7 层网络模型中的会话层, 动态 web 应用使用 cookie 来保存会话信息。HTTP/1.1 默认开启长连接来优化性能, 但 HTTP 连接和请求依然是无状态的。对传统提供静态内容服务, 或返回信息相对确定的 web 应用而言, 这样的设计并没有问题, 或者说虽然有一些不足, 但尚能忍受。无状态的设计也简化了 HTTP 测试, 日志回放也成为重要的 HTTP 服务测试手段之一。

websocket 协议简述
    直到 "服务器推" 场景的出现。服务器端信息随时可能变化, 我们希望将变化后最新的信息立即通知给客户端。传统的解决方案是客户端不断轮询服务器, 如每秒 1 次。这种轮询将产生许多额外的代价, 包括移动端流量收费, 并且编程模型也相对复杂。因此, 是时候开放 TCP 双向通信的能力了。我们可以重新写一个 TCP 服务器, 使用新的协议来通信。但也许是为了复用 HTTP 的 80 端口, 依附现有 HTTP 生态圈, 让 web 应用平滑升级, websocket 基于 HTTP 协议设计, 顾名思义就是基于 web HTTP 协议, 释放原生 TCP socket 的能力。所以 websocket 一开始还是按 HTTP 协议通信, 随后才转换成 websocket。

一个 websocket 连接的建立过程如下:

客户端 服务器
1. 客户端建立到服务器的 TCP 连接
2. 客户端请求将当前 TCP 连接用作 websocket
3. 服务器收到请求, 同意并确认将此 TCP 连接用作 websocket
4. 客户端收到确认, HTTP 协议通信结束
5. 双方使用 websocket 协议自由双向通信
websocket 可基于 HTTP 建立, 即 ws 协议, 也可基于 HTTPS 建立, 即 wss 协议, 果然是复用了 HTTP 的基础设施。

HTTP 与 websocket 客户端
HTTP 客户端发送完请求后才会监听响应, 收到一次响应后即结束。常见的 HTTP 客户端有:

curl, 如 curl localhost:8080/http.
浏览器 js 客户端, 如 angularjs 的 $http 服务.

$http.get("/http").then(function(resp) {
    vm.msg = resp.data;
});
直接在浏览器输入 URL.

    回顾 "服务器推" 场景, websocket 与 HTTP 协议最大的不同在于服务器不必等待请求, 也不再使用 "请求", "响应" 这样的术语, 而改称为消息, 双方都可以随时互发消息。HTTP 客户端不会一直监听消息, 所以显然不能作为 websocket 客户端 (且不说协议是否兼容)。要使用 websocket, 客户端和服务器都需要改造。常见的 websocket 客户端有:

浏览器 js 客户端。感谢浏览器厂商, 现在的主流浏览器都支持 websocket 。
阅读全文直接点击:http://click.aliyun.com/m/9971/
分享到:
评论

相关推荐

    PHP实例开发源码—Timely在线客服系统开源版.zip

    1. **使用须知.txt**:这是一个文本文件,通常包含了项目的基本信息,如安装指南、系统需求、许可证信息、使用限制以及开发者可能需要注意的重要事项。在开始使用Timely在线客服系统之前,务必仔细阅读此文件,以...

    PHP实例开发源码—月光小屋 LChat.zip

    1. **使用须知.txt** - 这个文件通常包含关于如何正确安装、配置和使用LChat的重要信息,包括系统需求、环境设置步骤、数据库配置指南以及可能遇到的问题和解决方法等。开发者在开始使用源码之前应该首先阅读此文件...

    PHP实例开发源码-视频交友系统FuShow.zip

    文件名"使用须知.txt"可能是开发者提供的关于如何部署和运行此系统的指南,包括环境配置(如Apache或Nginx服务器,PHP版本要求等)、数据库设置、权限设置等重要信息。遵循这份指南,开发者或运维人员可以快速搭建并...

    PHP实例开发源码-影视APP源码 带直播功能与代理系统.zip

    文件“使用须知.txt”很可能是提供关于如何安装、配置和运行这个PHP应用的指南,可能包含了数据库设置、环境需求等关键信息。而“132698902332301274”这个名字看起来像是一个随机生成的文件名,这可能是某种临时...

    PHP实例开发源码—DuckChat PHP通讯系统(开源IM系统).zip

    【PHP实例开发源码—DuckChat PHP通讯系统(开源IM系统)】 DuckChat是一款基于PHP语言开发..."使用须知.txt"可能是项目部署和使用的指南,而"132676249509190697"可能是某个特定文件或版本号,具体用途需要解压后查看。

    PHP实例开发源码-诺云财经直播聊天系统 php版.zip

    在提供的压缩包中,"使用须知.txt"可能是项目使用和部署的指南,包含了运行环境配置、数据库连接设置等关键信息。而"132678402219739519"可能是一个随机生成的文件名,通常用于临时文件或日志,具体用途需查看文件...

    ASP实例开发源码-asp在线客服系统 v1.0.zip

    - "使用须知.txt":这可能是包含系统安装、配置和使用说明的文档,对开发者或管理员了解系统运行环境、部署步骤以及操作指南至关重要。 - "132676159083001071":这个文件名看起来不像是标准的ASCII文件名,可能是...

    PHP实例开发源码—哲雨 asp 聊天室(zvchat).zip

    【使用须知.txt】文件很可能是提供关于如何部署和运行这个聊天室应用的指南。通常,这类文件会包含必要的环境配置信息,比如需要的PHP版本、数据库设置、服务器配置以及其他依赖项。在开始使用源码之前,我们需要...

    PHP实例开发源码-哲雨 asp 聊天室(zvchat).zip

    另一个文件是"使用须知.txt",这通常是一份指导文档,包含了如何安装、配置和运行聊天室应用的详细步骤,以及可能的注意事项和问题解决方法。对于初次接触这个项目的开发者来说,这份文档是至关重要的,因为它提供了...

    基于html5实现的魅族首页贪食蛇游戏特效源码.zip

    HTML5是现代网页开发的基石,它引入了许多新特性,如Canvas画布、Web Storage、Web Workers和WebSocket等,使得开发者能够创建更加动态和交互性的网页应用。 【描述】"基于html5实现的魅族首页贪食蛇游戏特效源码....

    ASP实例开发源码-啊飞在线 ASP 聊天室.zip

    在压缩包中,“使用须知.txt”可能包含关于如何部署和运行这个ASP聊天室的指南,而“132689139755708136”可能是一个数据库文件,如mdb(Access)或mdf(SQL Server)文件,包含了聊天记录的数据。 总之,这个ASP...

    ASP实例开发源码-免费 在线客服系统个人版.zip

    在这个"使用须知.txt"文件中,很可能是包含了关于源码的使用指南,比如如何部署到服务器、如何配置数据库连接、需要注意的版权信息等。而"132690522176161750"这个文件名可能代表某个特定的文件或者资源,例如数据库...

    ASP实例开发源码-良精asp微博网站管理系统.zip

    此文件可能是提供给用户或开发者的一些使用指南,包括系统部署、配置、运行环境要求以及可能遇到的问题和解决方案。阅读这份文件对于正确理解和运行系统至关重要。 【文件"132676151253455922"】 文件名看似随机...

    html5实现的益智类超级极限摩托小游戏源码.zip

    这个源码包中的"使用须知.txt"可能包含了关于如何运行和修改游戏代码的指南,而"132687041214003833"可能是游戏的主文件或资源文件。通过分析和学习这个源码,开发者可以深入理解HTML5在游戏开发中的实际应用,并...

    HTML5实现的中秋节博饼游戏源码.zip

    6. **WebSocket**:如果游戏有在线多人对战功能,WebSocket能提供实时的双向通信,实现玩家间的互动。 7. ** Semantic Elements**:HTML5引入了许多语义化的标签,如、、等,有助于提高页面结构的清晰度和可访问性...

    html5实现好玩的手机端飞机大战小游戏源码.zip

    了解以上知识点后,你可以通过解压这个zip文件,阅读“使用须知.txt”来获取具体的游戏运行和修改指南,而“132692078671027465”可能是游戏的主要源代码文件或资源文件。通过研究这个源码,你可以深入学习HTML5游戏...

    html5手机版桌球台球游戏源码下载.zip

    在压缩包内的“使用须知.txt”中,可能会包含关于如何编译、运行和修改源码的指南。132696217291525443可能是另一个文件名,可能是一个数据库文件或者游戏的配置文件,具体用途需要查看文件内容才能确定。 总之,这...

Global site tag (gtag.js) - Google Analytics