从阿里云服务器购买、域名购买、SSL免费
一 WebSocket实战
1.1 认识WebSocket
上图说明
-
发送连接请求
客户端通过ws://host:port/ 的请求地址发起WebSocket请求连接。由JavaScript实现
WebSocket API与服务器建立WebSocket连接。host服务器ip,port为端口。 -
握手
服务器端接受请求后,会解析请求头信息,根据升级协议判断请求是否为WebSocket请求,并取出请求信息中的
Sec-WebSocket-Key字段的数据。按照某种算法生成一个新的字符串序列放到请求头Sec-WebSocket-Accept中。
Sec-WebSocket-Accept:服务器接受客户端HTTP协议升级证明。 -
建立WebSocket连接
客户端接受服务器的响应后,同样会解析请求头信息,取出Sec-WebSocket-Accept字段。
并用服务器端相同的算法对之前Sec-WebSocket-Accept的数据处理,看看处理后的和取出
的Sec-WebSocket-Accept对比。一样连接建立成功,不一样建立失败。
1.2 HTTP和WebSocket
上图说明
上图可以看出,HTTP每次请求都需要建立连接。WebSocket类似一个长链接,一旦建立后,后续数据
都是以帧序列方式传递。
-
HTTP和WebSocket关系
相同点:HTTP和WebSocket都是可靠的传输协议,都是应用层协议。
不同点:WebSocket是双向通信协议,模拟socket协议,可以双向发送和接受数据。HTTP是单向的。 -
WebSocket建立连接细节
WebSocket建立握手,数据是通过HTTP传输的。但是建立连接后,在真正传输的时候不需要HTTP协议的。
WebSocket中,浏览器和服务器进行一个握手之后,然后单独建立一条TCP的通信通道,进行数据传递。 -
WebSocket优点
双工通信代替轮询。可以做即时通信和消息推送。
1.3 SpringBoot集成WebSocket
- 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
- 开启WebSocket支持端点
@Configuration
public class Config {
@Bean
public ServerEndpointExporter serverEndpointExporter(){
return new ServerEndpointExporter();
}
}
- 创建server核心类
@ServerEndpoint("/ws/{userId}")
@Component
public class WebSocketServer {
//日志
static Log log = LogFactory.getLog(WebSocketServer.class);
//在线数量
private static final AtomicInteger onlineCount = new AtomicInteger(0);
//处理客户端连接socket
private static Map<String, WebSocketServer> webSocketMap = new ConcurrentHashMap<>();
//会话信息
private Session session;
//用户信息
private String userId = "";
/*
* @Description: 打开WebSokcet连接
*/
@OnOpen
public void onOPen(@PathParam("userId") String userId, Session session) {
//处理session和用户信息
this.session = session;
this.userId = userId;
if (webSocketMap.containsKey(userId)) {
webSocketMap.remove(userId);
webSocketMap.put(userId, this);
} else {
webSocketMap.put(userId, this);
//增加在线人数
addOnlineCount();
}
try {
//处理连接成功消息的发送
sendMessage("Server>>>>远程WebSoket连接成功");
log.info("用户" + userId + "成功连接,当前的在线人数为" + getOnlineCount());
} catch (Exception e) {
e.printStackTr