WebSocket是经过单个TCP链接提供全双工(双向通讯)通讯信道的计算机通讯协议。此WebSocket API可在用户的浏览器和服务器之间进行双向通讯。用户能够向服务器发送消息并接收事件驱动的响应,而无需轮询服务器。 它能够让多个用户链接到同一个实时服务器,并经过API进行通讯并当即得到响应。java
后端在接收到用户新下的订单后,通知到后台系统web
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket<artifactId> </dependency>
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.server.standard.ServerEndpointExporter; /** * websocket配置 * @author : wang zns * @date : 2019-05-06 */ @Configuration public class WebSocketConfig { @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } }
import lombok.extern.slf4j.Slf4j; 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.ServerEndpoint; import java.io.IOException; import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.atomic.LongAdder; /** * websocket服务端核心类 * @author : wang zns * @date : 2019-05-06 */ @ServerEndpoint("/websocket") @Component @Slf4j public class WebSocketService { /** * 记录当前websocket的链接数(保证线程安全) */ private static LongAdder connectAccount = new LongAdder(); /** *存放每一个客户端对应的websocketServer对象(需保证线程安全) */ private static CopyOnWriteArraySet<WebSocketService> webSocketSet = new CopyOnWriteArraySet<>(); /** * 与客户端的链接对象 */ private Session session; /** * 链接成功调用的方法 * @param session */ @OnOpen public void onOpen(Session session) { this.session = session; webSocketSet.add(this); connectAccount.increment(); log.info("有新的链接接入,当前链接数为{}", connectAccount); } /** * 链接关闭时调用 */ @OnClose public void onClose() { webSocketSet.remove(this); connectAccount.decrement(); log.info("有链接关闭,当前链接数为{}", connectAccount); } /** * 收到客户端消息时调用 * @param message */ @OnMessage public void onMessage(String message) { log.info("收到客户端发来的消息,message -> {}", message); } /** * 服务端向客户端发送消息 * @param message */ public void sendMessage(String message) { for (WebSocketService webSocketService : webSocketSet) { try { log.info("【websocket消息】 广播消息, message={}", message); webSocketService.session.getBasicRemote().sendText(message); } catch (IOException e) { log.info("向客户端发送消息失败, {}", e.getMessage()); } } } }
在此案例中,咱们的客户端为浏览器,因此直接经过js进行链接spring
<script> var websocket; if ('WebSocket' in window) { websocket = new WebSocket('ws://127.0.0.1:9988/sell/websocket'); } else { alert("你的浏览器暂不支持websocket,请更换其余浏览器再试"); } websocket.onopen = function (event) { console.log("创建链接"); }; websocket.onclose = function (event) { console.log("关闭链接"); }; websocket.onmessage = function (event) { console.log("收到消息," + event.data); // 弹窗提示与播放提示音乐 setTimeout(function () { document.getElementById('notice').play(); },1000); $("#orderModal").modal('show'); }; websocket.onerror = function (event) { console.log("websocket异常"); }; /** * readyState状态以下: * CONNECTING:值为0,表示正在链接; OPEN:值为1,表示链接成功,能够通讯了; CLOSING:值为2,表示链接正在关闭; CLOSED:值为3,表示链接已经关闭,或者打开链接失败。 */ // 向服务端发送消息(必须为open状态时可发送) if (websocket.readyState === 1) { websocket.send("服务端你好"); } </script>
websocket的做用远不止这些,本文只是一种较为常见的用法; 在最后附上参考的blog -> Spring Boot整合websocket实现群聊,点对点聊天后端