WebSocket入门
WebSocket是一种协议,用于在Web应用程序和服务器之间建立实时、双向的通信连接。它通过一个单一的TCP连接提供了持久化连接,这使得Web应用程序可以更加实时地传递数据。WebSocket协议最初由W3C开发,并于2011年成为标准。
WebSocket协议生命周期

客户端向服务器发送一个 WebSocket 握手请求,服务器响应一个握手响应,连接建立。一旦连接建立,客户端和服务器就可以在连接上互相发送数据,直到其中一方发送一个关闭帧来关闭连接。在关闭帧被接收后,连接就会被关闭,WebSocket 连接关闭完成。
与Http协议的区别
http协议生命周期:

- Http是短连接,只能由客户端发起,做不到服务器主动向客户端推送信息。
- WebSocket是长连接
- Http通信是单向的,基于请求响应模式
- WebSocket支持双向通信
应用场景
实时通信
视频弹幕
体育实况更新
股票基金实时更新
在Java应用
WebSocket工具类
package com.sky.websocket;
import org.springframework.stereotype.Component; import javax.websocket.OnClose; import javax.websocket.OnMessage; import javax.websocket.OnOpen; import javax.websocket.Session; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import java.util.Collection; import java.util.HashMap; import java.util.Map;
@Component @ServerEndpoint("/ws/{sid}") public class WebSocketServer {
private static Map<String, Session> sessionMap = new HashMap();
@OnOpen public void onOpen(Session session, @PathParam("sid") String sid) { System.out.println("客户端:" + sid + "建立连接"); sessionMap.put(sid, session); }
@OnMessage public void onMessage(String message, @PathParam("sid") String sid) { System.out.println("收到来自客户端:" + sid + "的信息:" + message); }
@OnClose public void onClose(@PathParam("sid") String sid) { System.out.println("连接断开:" + sid); sessionMap.remove(sid); }
public void sendToAllClient(String message) { Collection<Session> sessions = sessionMap.values(); for (Session session : sessions) { try { session.getBasicRemote().sendText(message); } catch (Exception e) { e.printStackTrace(); } } }
}
|
Maven坐标
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency>
|
WebSocket配置类
package com.sky.config;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.server.standard.ServerEndpointExporter;
@Configuration public class WebSocketConfiguration {
@Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); }
}
|
示例
@Override public void reminder(Long id) { Orders ordersDB = orderMapper.getById(id);
if (ordersDB == null ) { throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR); }
Map map=new HashMap(); map.put("type", 2); map.put("orderId", id); map.put("content", "订单号:" + ordersDB.getNumber()); String json = JSON.toJSONString(map); webSocketServer.sendToAllClient(json);
}
|
