SharedWorker结合WebSocket实现多窗口共享消息

// sharedWorker.js 文件

let connections = {};
let reconnectInterval = 3000; // 重新连接间隔时间,单位:毫秒

onconnect = (event) => {
  const port = event.ports[0];

  port.onmessage = (event) => {
    const data = event.data;

    // console.log(event.data, "event.data"); // 确保这个日志在控制台中显示

    if (data.type === 'connect') {
      connectWebSocket(data.name, data.url, port, data.msg);
    }
  };
};

function connectWebSocket(name, url, port, msg) {
  if (!connections[name]) {
    const ws = new WebSocket(url);

    ws.onopen = () => {
      ws.send(JSON.stringify(msg));

      setHeartbeat(ws, name, url, port, msg);
    }

    ws.onmessage = (event) => {
      if (!event) {
        return
      }

      if (connections[name]) {
        connections[name].forEach(client => {
          client.postMessage({ name: name, data: event.data });
        });
      }
    };

    ws.onclose = () => {
      if (connections[name]) {
        connections[name].forEach(client => {
          client.close();
        });
        delete connections[name];
      }
      ws.close();
    };

    ws.onerror = (error) => {
      // 删除共享线程
      removeWebSocket(name);

      // 重新连接
      setTimeout(() => {
        connectWebSocket(name, url, port, msg);
      }, reconnectInterval);
    };

    connections[name] = new Set();
  }
  // connections[name].delete(port); // 暂时没想到如何删除旧端口连接

  connections[name].add(port);

  // console.log(connections); // 确保这个日志在控制台中显示
}

function setHeartbeat(ws, name, url, port, msg) {
  const heartbeatInterval = 30000; // 心跳间隔时间,单位:毫秒
  const heartbeatMessage = 'ping'; // 心跳消息

  ws.heartbeatTimer = setInterval(() => {
    if (ws.readyState === WebSocket.OPEN) {
      ws.send(heartbeatMessage);
    } else {
      clearInterval(ws.heartbeatTimer);

      setTimeout(() => {
        connectWebSocket(name, url, port, msg);
      }, reconnectInterval);
    }
  }, heartbeatInterval)
}

function removeWebSocket(name) {
  for ( const connection of connections[name] ) {
    if (!!connection) {
      connection.close();
    }
  }
}
// 放到需要连接的地方

        // 检查是否支持SharedWorker
        if (window.SharedWorker) {
          const worker = new SharedWorker("/js/sharedWorker.js", "自定义");

          const port = worker.port;

          port.postMessage({ type: '', name: '', url: "", msg: "/XXX连接成功" });

          port.postMessage({ type: '', name: '', url: "", msg: "/XXX连接成功" });

          // 传递消息
          port.onmessage = (event) => {
            Utils.$emit("sharedWorkerWssMessage", event.data);
          };
        }

谷歌浏览器打开chrome://inspect/#workers 查看wss进程

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是springboot结合websocket实现聊天的步骤: 1. 添加websocket依赖 在pom.xml中添加以下依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> ``` 2. 创建websocket配置类 创建一个配置类,用于注入websocket相关的bean: ``` @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(myHandler(), "/myHandler").setAllowedOrigins("*"); } @Bean public MyHandler myHandler() { return new MyHandler(); } } ``` 其中,`MyHandler`是自定义的websocket处理器,`/myHandler`是websocket的访问路径,`setAllowedOrigins("*")`是设置允许跨域访问。 3. 创建websocket处理器 创建一个websocket处理器,用于处理websocket连接、消息接收、消息发送等操作: ``` public class MyHandler extends TextWebSocketHandler { private static final List<WebSocketSession> sessions = new CopyOnWriteArrayList<>(); @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { sessions.add(session); } @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { String payload = message.getPayload(); for (WebSocketSession s : sessions) { s.sendMessage(new TextMessage(payload)); } } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { sessions.remove(session); } } ``` 其中,`sessions`用于保存所有连接的websocket会话,`afterConnectionEstablished`方法在websocket连接建立时被调用,`handleTextMessage`方法用于处理消息接收并发送给所有会话,`afterConnectionClosed`方法在websocket连接关闭时被调用。 4. 创建websocket前端页面 在前端页面中添加websocket的连接和消息发送代码: ``` var socket = new WebSocket("ws://localhost:8080/myHandler"); socket.onmessage = function(event) { console.log(event.data); }; function sendMessage() { socket.send($("#message").val()); $("#message").val(""); } ``` 其中,`ws://localhost:8080/myHandler`是websocket的连接地址,`socket.onmessage`用于接收到新消息时执行的代码,`sendMessage`用于发送新消息。 5. 运行程序并测试 启动springboot应用程序,访问前端页面,并在多个浏览器窗口中测试发送消息的功能。 以上就是springboot结合websocket实现聊天的全部步骤,希望能帮助到你。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值