一、简介
WebSocket是一种网络通信协议
发展原因 --- 解决实时 Web 应用的窘境
轮询:这是最早的一种实现实时 Web 应用的方案。客户端以一定的时间间隔向服务端发出请求,以频繁请求的方式来保持客户端和服务器端的同步。这种同步方案的最大问题是,当客户端以固定频率向服务器发起请求的时候,服务器端的数据可能并没有更新,这样会带来很多无谓的网络传输,所以这是一种非常低效的实时方案。
长轮询:是对定时轮询的改进和提高,目地是为了降低无效的网络传输。当服务器端没有数据更新的时候,连接会保持一段时间周期直到数据或状态改变或者时间过期,通过这种机制来减少无效的客户端和服务器间的交互。当然,如果服务端的数据变更非常频繁的话,这种机制和定时轮询比较起来没有本质上的性能的提高。
流:流技术方案通常就是在客户端的页面使用一个隐藏的窗口向服务端发出一个长连接的请求。服务器端接到这个请求后作出回应并不断更新连接状态以保证客户端和服务器端的连接不过期。通过这种机制可以将服务器端的信息源源不断地推向客户端。这种机制在用户体验上有一点问题,需要针对不同的浏览器设计不同的方案来改进用户体验,同时这种机制在并发比较大的情况下,对服务器端的资源是一个极大的考验。
对比HTTP协议: HTTP协议缺陷之一 --- 通信只能由客户端发起
WebSocket --- 服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息
二、特点
(1)建立在 TCP 协议之上,服务器端的实现比较容易。
(2)与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。
(3)数据格式比较轻量,性能开销小,通信高效。
(4)可以发送文本,也可以发送二进制数据。
(5)没有同源限制,客户端可以与任意服务器通信。
(6)协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。
三、使用 WebSocket 接口构建 Web 应用
1.构建一个实现了 WebSocket 规范的服务器
Kaazing WebSocket Gateway — 一个 Java 实现的 WebSocket Server
mod_pywebsocket — 一个 Python 实现的 WebSocket Server
Netty — 一个 Java 实现的网络框架其中包括了对 WebSocket 的支持
node.js — 一个 Server 端的 JavaScript 框架提供了对 WebSocket 的支持
将使用 Microsoft .NET 平台上的 C# 语言来打造一个简单的 WebSocket 服务器
2.了解WebSocket JavaScript 接口
function WebSocketTest() {
if ("WebSocket" in window) {
alert("您的浏览器支持 WebSocket!");
// 打开一个 web socket
var ws = new WebSocket("ws://localhost:9998/echo");
ws.onopen = function() {
// Web Socket 已连接上,使用 send() 方法发送数据
ws.send("发送数据");
alert("数据发送中...");
};
ws.onmessage = function (evt) {
var received_msg = evt.data;
alert("数据已接收...");
};
ws.onclose = function() {
// 关闭 websocket
alert("连接已关闭...");
};
}
else {
// 浏览器不支持 WebSocket
alert("您的浏览器不支持 WebSocket!");
}
}
3.浏览器支持
4.WebSocket 实战过程
俩大步=》服务端的实现和客户端的实现 (websocket服务器的搭建)
-----github 地址: https://github.com/Turbohui/create-nodeServer
实例1:聊天室的实现
实例2:股票的涨跌
----github地址:https://github.com/Turbohui/webSocket-Product