websocket是h5才有的一种通讯技术,websocket使客户端(浏览器)与服务器建立持久通讯。
引入一个应用场景
这是微博的左侧通知栏目,当你在看微博的时候,如果有人发了微博,这里会实时自动更新未阅读的微博个数。怎么才可以做到呢?
办法一: Ajax轮循
使用死循环,和ajax对后台数据无线轮循访问,如果有新的更新,这里会自动增加。
办法二 H5的WebSocket
WebSocket是一个基于TCP协议的协议。可以建立持久通讯,与后台实时交互,更新前台数据。
建立过程:
客户端首先通过Http协议给后台发送请求,这个请求和通常的 HTTP 请求不同,包含了一些附加头信息,其中附加头信息”Upgrade: WebSocket”表明这是一个申请协议升级的 HTTP 请求,服务器接收请求之后,经过解读,如果支持WebSocket协议,给客户端发出相应,这个WebSocket持久通讯就建立起来了。
优点:
常规的客户端与服务端交互,首先是客户端有request请求,然后服务器才会有response的相应。request和response是一个完整的过程,并且response不能单独存在,也就是说,服务器端不能主动与客户端通讯,只有客户端发出了请求,服务端才可以回应response。WebSocket正好弥补了这个通讯的缺点,它可以主动与客户端进行通讯。
程序实现:
maven引入包
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
编写服务器WebSocketTest.java
package com.test;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
/**
* @ServerEndpoint 注解是一个类层次的注解,它的功能主要是将目前的类定义成一个websocket服务器端,
* 注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端
*/