1.引入依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-websocket</artifactId>
  4. </dependency>

2.新建WebSocket配置类

  1. @Configuration
  2. public class WebsocketConfiguration {
  3. @Bean
  4. public ServerEndpointExporter serverEndpointExporter() {
  5. return new ServerEndpointExporter();
  6. }
  7. }

3.新建WebSocket服务端

  1. import java.util.Map;
  2. import java.util.concurrent.ConcurrentHashMap;
  3. import javax.websocket.OnClose;
  4. import javax.websocket.OnError;
  5. import javax.websocket.OnMessage;
  6. import javax.websocket.OnOpen;
  7. import javax.websocket.Session;
  8. import javax.websocket.server.ServerEndpoint;
  9. import org.slf4j.Logger;
  10. import org.slf4j.LoggerFactory;
  11. import org.springframework.stereotype.Component;
  12. /**
  13. * WebSocket服务端
  14. * @author jspanjsp
  15. *
  16. */
  17. //你的WebSocket访问地址
  18. @ServerEndpoint("/webSocket")
  19. @Component
  20. public class MyWebsocketServer {
  21. /**
  22. * 存放所有在线的客户端
  23. */
  24. private static Map<String, Session> clients = new ConcurrentHashMap<>();
  25. private static final Logger log = LoggerFactory.getLogger(MyWebsocketServer.class);
  26. @OnOpen
  27. public void onOpen(Session session) {
  28. log.info("有新的客户端连接了: {}", session.getId());
  29. //将新用户存入在线的组
  30. clients.put(session.getId(), session);
  31. }
  32. /**
  33. * 客户端关闭
  34. * @param session session
  35. */
  36. @OnClose
  37. public void onClose(Session session) {
  38. log.info("有用户断开了, id为:{}", session.getId());
  39. //将掉线的用户移除在线的组里
  40. clients.remove(session.getId());
  41. }
  42. /**
  43. * 发生错误
  44. * @param throwable e
  45. */
  46. @OnError
  47. public void onError(Throwable throwable) {
  48. throwable.printStackTrace();
  49. }
  50. /**
  51. * 收到客户端发来消息
  52. * @param message 消息对象
  53. */
  54. @OnMessage
  55. public void onMessage(String message) {
  56. log.info("服务端收到客户端发来的消息: {}", message);
  57. this.sendAll(message);
  58. }
  59. /**
  60. * 群发消息
  61. * @param message 消息内容
  62. */
  63. private void sendAll(String message) {
  64. for (Map.Entry<String, Session> sessionEntry : clients.entrySet()) {
  65. sessionEntry.getValue().getAsyncRemote().sendText(message);
  66. }
  67. }
  68. }

4. 启动后,客户端连接websocket

  1. $(function(){
  2. var websocket = null;
  3. //浏览器是否支持
  4. if ('WebSocket' in window) {
  5. // 上面我们给webSocket定位的路径(MyWebsocketServer.java配置的@ServerEndpoint)
  6. websocket = new WebSocket('ws://localhost:80/webSocket');
  7. } else {
  8. alert('该浏览器不支持websocket!');
  9. }
  10. //建立连接
  11. websocket.onopen = function (event) {
  12. console.log('建立连接');
  13. //给服务端发送消息
  14. websocket.send("客户端发送消息");
  15. }
  16. //关闭连接
  17. websocket.onclose = function (event) {
  18. console.log('连接关闭');
  19. }
  20. //消息来的时候的事件
  21. websocket.onmessage = function (event) {
  22. // 这里event.data就是我们从后台推送过来的消息
  23. console.log('收到消息:' + event.data);
  24. // 在这里我们可以在页面中放置一个音乐,例如“您有新的订单了!”这样的提示音
  25. document.getElementById("newOrderMp3").play();
  26. }
  27. //发生错误时
  28. websocket.onerror = function () {
  29. alert('websocket通信发生错误!');
  30. }
  31. //窗口关闭时,Websocket关闭
  32. window.onbeforeunload = function () {
  33. websocket.close();
  34. }
  35. });

5. 客户端发送消息得到的响应和服务端的响应

image.png