WebSocket其实很简单

261 阅读3分钟

1什么是webSocket

WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议 。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就可以建立持久性的连接,并进行双向数据传输。

简单来说

WebSocket 是一种网络通信协议,他可以让服务器将数据主动推送给客户端,主要用于web即时通讯。

注:web即时通讯的解决方案主要有三种:(1)ajax轮询原理非常简单,让浏览器隔个几秒就发送一次请求,问问服务器有没有新消息。但是有个非常致命的缺点,浪费带宽和服务器资源。(2)long poll(长轮询)客户端发起连接后,如果没消息,就一直不返回Response给客户端。直到有消息才返回,返回完之后,客户端再次建立连接,周而复始。这样做是解决了无限调用接口的弊端,但是却一直维护了一个长链接,会让一个http请求一直处在pedding状态!服务器压力也是相当大,所以,还是不可取(3)websocket,由于传输数据需要进行二次解析,增加开发成本及难度

2websocket原理

如上图所示: http和webSocket其实是个交集,他们的使用都是建立在tcp链接之上。
要想使用webSocket与server建立链接,首先需要去建立一个tcp链接,然后握手阶段采用的是 HTTP/1.1 协议,实际上我认为他就是借用一部分http协议的东西来完成它的连接。

如上图所示,我们在ws中就能看到这个持久的webSocket 可以看到websocket在http的基础上加了点东西,告诉服务器,我是个websocket请求 服务器做了解析和处理以后就能结结实实的通信了!

  • 协议标识符是ws(如果加密,则为wss),服务器网址就是 URL
  • Upgrade 是告诉客户端我们成功切换成websocket协议了 如此之后算是建立了一个websocket链接

3websocket如何使用

var ws = new WebSocket("wss://wfsd.huaplus.com:9901/");
//实例对象的onopen属性,用于指定连接成功后的回调函数。
ws.onopen = function(evt) { 
  console.log("Connection open ..."); 
  //实例对象的send()方法用于向服务器发送数据。
  ws.send("Hello WebSockets!");
};
//实例对象的onmessage属性,用于指定收到服务器数据后的回调函数。
ws.onmessage = function(evt) {
  console.log( "Received Message: " + evt.data);
  ws.close();
};
//实例对象的onclose属性,用于指定连接关闭后的回调函数。
ws.onclose = function(evt) {
  console.log("Connection closed.");
};     

4websocket特点

  • 1、建立在 TCP 协议之上,服务器端的实现比较容易。
  • 2、与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。
  • 3、数据格式比较轻量,性能开销小,通信高效。
  • 4、可以发送文本,也可以发送二进制数据。
  • 5、没有同源限制,客户端可以与任意服务器通信。