场景:在B/S结构的系统中,有时客户端需要实时的获得服务器反馈的消息,但是HTTP协议只支持请求响应模式,所以我们经常通过轮询(polling)、长轮询(Long polling)、长连接、WebSocket等方式来完成实时消息的推送功能。
HTTP请求响应模式:
优点:简化Web服务器,减少服务器的负担,加快响应速度,因为服务器不需要与客户端长时间建立一个通信链接。
缺点:不容易直接完成实时消息的推送功能,如聊天室、实时更新数据等功能。
轮询:客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接。
优点:后端程序编写比较容易。
缺点:大多数的请求都是无用的,浪费带宽和服务器资源。
长轮询:客户端向服务器发送Ajax请求,服务器接到请求后一直持有(hold住)连接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。
优点:在无消息的情况下不会频繁的请求,耗费资小。
缺点:服务器hold连接会消耗资源,返回数据顺序无保证,难于管理维护。
长连接:在页面里嵌入一个隐蔵iframe,将这个隐蔵iframe的src属性设为对一个长连接的请求或是采用xhr请求,服务器端就能源源不断地往客户端输入数据。
优点:消息即时到达,不发无用请求,管理起来也相对便。
缺点:服务器维护一个长连接会增加开销。
Websocket
1)概念:WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯(即允许服务器主动发送信息给客户端)的网络技术,基于TCP协议,可以实现客户端和服务器端的长连接,双向实时通信。
2)特点:事件驱动、异步。
3)WebSocket客户端:
概念:
1)websocket允许浏览器通过JavaScript与远程服务器建立连接,从而实现客户端与服务器间双向的通信。
2)websocket采用的协议是ws(如果需要ssl加密则使用wss),当我们调用websocket的构造方法构建一个websocket对象之后,浏览器就可以和服务器进行实时通信了。
websocket中的方法:
send() 向远程服务器发送数据
close() 关闭与服务器之间的websocket链接
onopen 当网络连接建立时触发该事件
onerror 当网络发生错误时触发该事件
onclose 当websocket被关闭时触发该事件
onmessage 当websocket接收到服务器发来的消息的时触发的事件,也是通信中最重要的一个监听事件。
websocket中的属性:
readyState 这个属性表示websocket所处的状态:
CONNECTING(0) websocket正尝试与服务器建立连接
OPEN(1) websocket与服务器已经建立连接
CLOSING(2) websocket正在关闭与服务器的连接
CLOSED(3) websocket已经关闭了与服务器的连接
4)WebSocket服务器端:
概念:
1)@ServerEndpoint注解修饰的类作为WebSocket服务器的端点。
2)@ServerEndpoint注解修饰的类必须有一个公共的无参数构造函数。
举例:
/**
* 1)该注解表示:我们可以在客户端浏览器上通过访问以下地址来与服务器建立长连接,从而进行实时通信。
* 2)访问地址:ws://[服务器IP]:[服务器端口]/项目名/websocket/task/{name}
*/
@ServerEndpoint(value = "/websocket/task/{name}")
public class WebSocketServer {
/**
* 连接打开时执行
*/
@OnOpen
public String onOpen(@PathParam("name") String taskName, Session session) {
}
/**
* 客户端调用socket.send()方法,服务器收到消息时执行该方法,该方法的返回值即:返回给客户端的信息。
*/
@OnMessage
public String onMessage(String message, Session session) {
}
/**
* 连接关闭时执行
*/
@OnClose
public void onClose(Session session, CloseReason closeReason) {
}
/**
* 连接错误时执行
* 说明:如果客户端直接关闭了浏览器,则服务器先调用OnError方法,后调用OnClose方法。
*/
@OnError
public void onError(Throwable t) {
t.printStackTrace();
}
}
WebSocket简介
最新推荐文章于 2019-12-28 18:30:21 发布