WebSocket知识概括

WebSocket知识概括

  • 连接与轮询
  • WebSocket简介
  • Websocket使用
  • 聊天室
  • websocket总结

连接与轮询

短连接和长连接:

  • 短连接:每次Http请求都会建立Tcp连接,管理容易
  • 长连接︰
    ①只需要建立一次Tcp连接,以后Http请求重复使用同一个Tcp连接,管理难
    ②在长连接的应用场景下,client端一般不会主动关闭它们之间的连接,Client与server之间的连接如果一直不关闭的话,会存在一个问题,随着客户端连接越来越多,server早晚有扛不住的时候,这时候server端需要采取一些策略,如关闭一些长时间没有读写事件发生的连接,这样可以避免一些恶意连接导致server端服务受损;如果条件再允许就可以以客户端机器为颗粒度,限制每个客户端的最大长连接数,这样可以完全避免某个蛋疼的客户端连累后端服务。
  • 区分:HTTP1.1规定了默认保持长连接(HTTP persistent connection ,也有翻译为持久连接),数据传输完成了保持TCP连接不断开(不发RST包、不四次握手),等待在同域名下继续用这个通道传输数据;相反的就是短连接如果服务器没有告诉客户端超时时间也没关系,服务端可能主动发起四次握手断开TCP连接,客户端能够知道该TCP连接已经无效;另外TCP还有心跳包来检测当前连接是否还活着,方法很多,避免浪费资源。
connection: keep-alive
Keep-Alive: timeout=20
  • 选择:长连接和短连接的产生在于client和server采取的关闭策略,具体的应用场景采用具体的策略,没有十全十美的选择,只有合适的选择
  • 应用场景区别:
    ①一般长连接(追求实时性高的场景)用于少数client-end to server-end的频繁的通信,例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。
    ②而像WEB网站的http服务一般都用短链接(追求资源易回收场景),因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源。

短轮询和长轮询:

  • 轮询和短连接与长连接有本质区别,轮询是为了实现服务器推送技术。
  • 短轮询:重复发送Http请求,查询目标事件是否完成。
    ①优点:编写简单
    ②缺点:浪费带宽和服务器资源
    ③短轮询应用:http 短轮询一般用在实时性要求不高的地方, 比如新浪微薄的未读条数查询就是浏览器端每隔一段时间查询的.
  • 长轮询:在服务端hold住Http请求(死循环或者sleep等等方式),等到目标时间发生,返回Http响应。
    ①优点:在无消息的情况下不会频繁的请求
    ②缺点:编写复杂
    ③长轮询应用:长轮询一般用在 web im, im 实时性要求高, http 长轮询的控制权一直在服务器端, 而数据是在服务器端的, 因此实时性高。
    <1>像新浪微薄的im, 朋友网的 im 以及 webQQ 都是用 http 长轮询实现的;
    <2>NodeJS 的异步机制貌似可以很好的处理 http 长轮询导致的服务器瓶颈问题, 这个有待研究。

轮询和连接区别:

  • 轮询也是连接,只是不保持连接,得到数据就关闭。轮询是单向的。长连接是双向的。
  • 但是轮询的好处是不占用端口和连接资源,如果你只有很少的数据需要获取,并且单向访问,就用轮询。
  • 短轮询:客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接。
    ①优点:后端程序编写比较容易。
    ②缺点:请求中有大半是无用,浪费带宽和服务器资源。
    ③实例:适于小型应用。
  • 长轮询:客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。
    ①优点:在无消息的情况下不会频繁的请求。
    ②缺点:服务器hold连接会消耗资源。
    ③实例:WebQQ、Hi网页版、Facebook IM。

WebSocket简介

websocket简述:

  • WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
    ①WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
    ②在 WebSocket API中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。
  • 现在很多网站为了实现推送技术,所用的技术都是 Ajax轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。
    ①这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。
  • HTML5 定义的 WebSocket 协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。
    ①浏览器通过 JavaScript 向服务器发出建立 WebSocket 连接的请求,连接建立以后,客户端和服务器端就可以通过 TCP 连接直接交换数据。
    ②当你获取 Web Socket 连接后,你可以通过 send() 方法来向服务器发送数据,并通过 onmessage事件来接收服务器返回的数据。
    WebSocket知识概括_第1张图片

Websocket 执行流程:

  • 对于 WebSocket 的整个生命周期,主要由以下几个事件组成:
    ①连接建立:客户端向服务端请求建立连接并完成连接建立
    ②数据上行:客户端通过已经建立的连接向服务端发送数据
    ③数据下行:服务端通过已经建立的连接向客户端发送数据
    ④客户端断开:客户端要求断开已经建立的连接
    ⑤服务端断开:服务端要求断开已经建立的连接
    WebSocket知识概括_第2张图片

WebSocket 协议:

  • WebSocket 协议使用 ws 和 wss URL协议,以分别代表不安全和安全的WebSocket请求。
  • 使用WebSocket构造函数来创建一个WebSocket连接,构造函数会返回一个WebSocket实例,可以用来监听事件。以下代码用于创建WebSocket连接 :
    ①以下代码中的第一个参数 url, 指定连接的 URL。第二个参数 protocol 是可选的,指定了可接受的子协议。
// 创建一个新的WebSocket. 
var websocket = new WebSocket(url, [protocol] );
  • websocket使用场景分享:
    ①如弹幕,
    ②网页聊天系统,
    ③实时监控,
    ④股票行情推送等

Websocket前端简介:

  • WebSocket 属性:
    ①binaryType:使用二进制的数据类型连接。
    ②bufferedAmount(只读):未发送至服务器的字节数。
    ③extensions(只读):服务器选择的扩展。
    ④onclose:用于指定连接关闭后的回调函数。
    ⑤onerror:用于指定连接失败后的回调函数。
    ⑥onmessage:用于指定当从服务器接受到信息时的回调函数。
    ⑦onopen:用于指定连接成功后的回调函数。
    ⑧protocol(只读):用于返回服务器端选中的子协议的名字。
    ⑨readyState(只读):返回当前 WebSocket 的连接状态,共有 4 种状态:
    <1>CONNECTING — 正在连接中,对应的值为 0;
    <2>OPEN — 已经连接并且可以通讯,对应的值为 1;
    <3>CLOSING — 连接正在关闭,对应的值为 2;
    <4>CLOSED — 连接已关闭或者没有连接成功,对应的值为 3。

  • WebSocket 事件:WebSocket 是纯事件驱动,通过监听事件可以处理到来的数据和改变的链接状态。以下是 WebSocket 对象的相关事件。
    webSocket.onopen:在客户端和服务器之间建立连接后,将从Web Socket实例触发 open 事件,它被称为客户端和服务器之间的初始握手。连接建立后引发的事件称为 onopen ,open事件触发并建立了一个连接,用于指定连接成功后的回调函数。
    webSocket.onclose:关闭事件标志着服务器和客户端之间通信结束,无法进一步传输消息。实例对象的onclose属性,用于指定连接关闭后的回调函数。
    webSocket.onmessage:消息事件通常发生当服务器发送一些数据时,无论何时发送数据,都会触发 onmessage 函数。实例对象的onmessage属性,用于指定收到服务器数据后的回调函数。
    <1>注意:服务器发送给客户端的消息可能是文本,也可能是二进制数据(blob对象或Arraybuffer对象)。
    webSocket.onerror:响应意外故障的时候触发,用于指定报错时的回调函数,是调用服务器重连逻辑以及处理来自 WebSocket 对象的异常的最佳场所。

  • WebSocket 方法:
    ①webSocket.send:此操作通常首选用于与服务器的某些通信,包括发送消息,包括文本文件,二进制数据或图像.。
    ②webSocket.close:此方法代表再见握手.它完全终止连接,在重新建立连接之前不会传输任何数据。

  • 前端代码演示:

DOCTYPE HTML>
<html>
   <head>
   

你可能感兴趣的:(JavaEE,Websocket)