WebSocket 是基于 TCP 的一种新的网络协议,可以实现浏览器与服务器
之间实时
、双向
的通信
HTTP通信是单向的,基于请求响应模式(先请求,后响应)
应用场景 
-
HTTP协议稳定易实现,大部分Web开发后台都没有主动发送数据给前端的需求
-
WebSocket协议相对复杂,维护长连接也需要增加服务器资源开销,还要处理连接端开后重连问题
因此WebSocket并不能取代HTTP,它只适合在高实时
的场景,需要服务器给客户端主动推送数据
package com.websocket;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;/*** WebSocket配置类,用于注册WebSocket的Bean*/
@Configuration
public class WebSocketConfiguration {//ServerEndpointExporter注册标注了@ServerEndpoint的对象到IOC容器中@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}}
package com.websocket;import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;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.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;/*** @ServerEndpoint 注解是一个类层次的注解,它的功能主要是将目前的类定义成一个websocket服务器端,* 注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端。*/
@Component
@Slf4j
@ServerEndpoint("/ws/{cid}")
public class WebSocketServer {//存放会话对象private static Map<String, Session> sessionMap = new ConcurrentHashMap();/*** 连接建立成功调用的方法*/@OnOpenpublic void onOpen(Session session, @PathParam("cid") String cid) {System.out.println("客户端:" + cid + "建立连接");sessionMap.put(cid, session);}/*** 连接关闭调用的方法* @param cid*/@OnClosepublic void onClose(@PathParam("cid") String cid) {System.out.println("连接断开:" + cid);sessionMap.remove(cid);}/*** 监听客户端发送过来的消息* @param message 客户端发送过来的消息* @param cid 客户端ID*/@OnMessagepublic void onMessage(String message, @PathParam("cid") String cid) {System.out.println("收到来自客户端:" + cid + "的信息:" + message);}/*** 群发消息* @param message*/public void sendToAllClient(String message) {Collection<Session> sessions = sessionMap.values();for (Session session : sessions) {try {//服务器向客户端发送消息session.getBasicRemote().sendText(message);} catch (Exception e) {e.printStackTrace();}}}
}