websocket是javascript新增的一个特性,可以实现服务端主动推送消息到浏览器,通过一个长连接达到这个效果,而且还支持跨域。
1.引入依赖包
\n org.springframework.boot \n spring-boot-starter-websocket \n
2.创建配置文件WebSocketConfig.java
@Configuration\npublic class WebSocketConfig {\n\n@Bean\npublic ServerEndpointExporter serverEndpointExporter () {\n return new ServerEndpointExporter();\n }\n}
3.创建服务器接口文件WebSocketServer.java:
/**\n* 前后端交互的类实现消息的接收推送(自己发送给自己)\n*\n* @ServerEndpoint(value = "/test/one") 前端通过此URI和后端交互,建立连接\n*/\n@Slf4j\n@ServerEndpoint(value = "/test/one")\n@Component\npublic class WebSocketServer {\n\n/**\n* 记录当前在线连接数\n*/\nprivate static AtomicInteger onlineCount = new AtomicInteger(0);\n\n/**\n* 连接建立成功调用的方法\n*/\n@OnOpen\npublic void onOpen(Session session) {\nonlineCount.incrementAndGet(); // 在线数加1\nlog.info("有新连接加入:{},当前在线人数为:{}", session.getId(), onlineCount.get());\n}\n\n/**\n* 连接关闭调用的方法\n*/\n@OnClose\npublic void onClose(Session session) {\nonlineCount.decrementAndGet(); // 在线数减1\nlog.info("有一连接关闭:{},当前在线人数为:{}", session.getId(), onlineCount.get());\n}\n\n/**\n* 收到客户端消息后调用的方法\n*\n* @param message 客户端发送过来的消息\n*/\n@OnMessage\npublic void onMessage(String message, Session session) throws InterruptedException {\nlog.info("服务端收到客户端[{}]的消息:{}", session.getId(), message);\n\nfor (int i = 0; i < 10; i++){\nThread.sleep(2000);\nthis.sendMessage("Hello, " + message, session);\n}\n}\n\n@OnError\npublic void onError(Session session, Throwable error) {\nlog.error("发生错误");\nerror.printStackTrace();\n}\n\n/**\n* 服务端发送消息给客户端\n*/\nprivate void sendMessage(String message, Session toSession) {\ntry {\nlog.info("服务端给客户端[{}]发送消息{}", toSession.getId(), message);\ntoSession.getBasicRemote().sendText(message);\n} catch (Exception e) {\nlog.error("服务端发送消息给客户端失败:{}", e);\n}\n}\n}
4.在static目录下创建前端请求页面index.html,
\n\n\nMy WebSocket \n\n\n\n\n\n\n\n\n\n\n 最后启动应用访问:localhost:8091/index.html(端口为你自己定义的端口) 就能看到效果啦,每隔2秒浏览器会新增一条消息。
注意:如果请求的时候出现 Sec-WebSocket-Accept”标头值不正确,记得清一下缓存再试。