WebSocket 主要解决的问题是 后端数据更新主动像前端推送数据

所需依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

开启Websocket 支持
package com.example.dome;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter; import javax.websocket.server.ServerEndpoint; /**
* @author SPC-044
* @date 13:39
* @Version 1.0
*/ @Configuration
public class WebSocketConfig { @Bean
public ServerEndpointExporter serverEndpointExporter(){
return new ServerEndpointExporter();
}
}

  

WebSocket  拦截服务类 
package com.example.dome;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RestController; import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.concurrent.ConcurrentHashMap; /**
* @author SPC-044
* @date 10:57
* @Version 1.0
*/
@ServerEndpoint("/webSocket/{id}")
@RestController
public class WebSocket { private static final Logger loger = LoggerFactory.getLogger(WebSocket.class); private static volatile int onlineCount = 0; // private static CopyOnWriteArraySet<WebSocket> webSocketSet =new CopyOnWriteArraySet(); private String id;
private static ConcurrentHashMap<String,WebSocket> webSocketMap = new ConcurrentHashMap(); private Session session;
@OnOpen
public void onOpen(Session session, @PathParam("id") String id){ //新建连接时调用
this.session=session;
this.id =id;
webSocketMap.put(id,this);
// webSocketSet.add(this);
loger.info("openWebSocket id={},name={}",id);
} @OnClose
public void onClose(){ //关闭链接时调用
if(webSocketMap.containsKey(id)){
webSocketMap.remove(id);
}
// webSocketSet.remove(this); loger.info("closeWebSocket。。。");
} @OnMessage
public void onMessage(String messsge,Session session){ //接受前端消息
loger.info("收到消息{}",messsge);
try { // sendMessage(messsge);
} catch (Exception e) {
e.printStackTrace();
}
} @OnError
public void onError(Session session,Throwable error){ //链接异常时访问
loger.info("链接错误");
} private void sendMessage(String message) throws Exception {
if(this.session.isOpen()){
this.session.getBasicRemote().sendText(message);
}
} public static void sendInfo(String id,String message){ // 后端主动像前端推消息
if(webSocketMap.get(id) !=null && webSocketMap.containsKey(id)){
try {
webSocketMap.get(id).sendMessage(message);
} catch (Exception e) {
e.printStackTrace();
}
}else {
loger.info("该用户不在线!");
}
}
}

  

前端代码

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p>123</p>
<button name="test" value="模拟建立链接" onclick="lianjie()" >test</button>
</body> <script type="text/javascript">
// 加载页面时生成随机数模拟不同用户的 Id
var id = Math.ceil(Math.random()*10);
console.log(id);
function lianjie() {
send();
}
// 加载页面时 建立链接 id 用于区分不同用户
var webSocket = new WebSocket("ws://127.0.0.1:8082/webSocket/"+id); webSocket.onerror = function () {
console.log("链接错误");
} webSocket.onopen = function () {
console.log("链接成功");
} webSocket.onmessage =function (event) {
console.log(event.data);
} webSocket.onclose = function () {
console.log("关闭链接");
} function closeWebSocket() {
webSocket.close();
} function send() {
webSocket.send("第一次发消息");
} </script>
</html>

后端主动像前端推送消息

 WebSocket.sendInfo("10", "id 10 你好"); 传入 用户id 及消息
    @RequestMapping("/webSocketTest")
public void websocketTest(){ Thread thread = new Thread(() -> {
WebSocket.sendInfo("1", "id 1 你好");
}); Thread thread1 = new Thread(() -> {
WebSocket.sendInfo("10", "id 10 你好");
}); thread.start();
thread1.start(); }

WebSocket 使用记录的更多相关文章

  1. WebSocket学习记录

    参考资料: Java后端WebSocket的Tomcat实现 基于Java的WebSocket推送 java WebSocket的实现以及Spring WebSocket 利用spring-webso ...

  2. python tornado websocket 多聊天室(返回消息给部分连接者)

    python tornado 构建多个聊天室, 多个聊天室之间相互独立, 实现服务器端将消息返回给相应的部分客户端! chatHome.py // 服务器端, 渲染主页 --> 聊天室建立web ...

  3. WebSocket 学习笔记

    WebSocket 学习笔记 来自我的博客 因为项目原因需要用到双工通信,所以比较详细的学习了一下浏览器端支持的 WebSocket. 并记录一些遇到的问题. 简介 WebSocket 一般是指浏览器 ...

  4. 接入WebSocket记录

    为什么用 WebSocket 因为APP里面有个聊天功能,需要服务器主动推数据到APP.HTTP 通信方式只能由客户端主动拉取,服务器不能主动推给客户端,如果有实时的消息,要立刻通知客户端就麻烦了,要 ...

  5. WebSocket对象的“readyState”属性记录连接过程中的状态值

    websocket的两个属性:readyState和bufferedAmount. 根据readyState属性可以判断webSocket的连接状态,该属性的值可以是下面几种: 0 :对应常量CONN ...

  6. error: Build input file cannot be found: '*******/node_modules/react-native/Libraries/WebSocket/libfishhook.a' 问题解决记录

    解决了刚才的'config.h' file not found问题,本以为就可以顺畅的跑起来,谁知道又被恶心到了,Build input file cannot be found!!! 问题: err ...

  7. spring websocket集群问题的简单记录

    目录 前言 解决方案 代码示例 前言 最近公司里遇到一个问题,在集群中一些websocket的消息丢失了. 产生问题的原理很简单,发送消息的服务和接收者连接的服务不是同一个服务. 解决方案 用中间件( ...

  8. 接入WebSocket记录 + 一些个人经验

    闲扯 WebSocket 以前没用过,之前写过一篇博客是基于原生socket的(查看)比较复杂,慎入.今天另外一个APP需要接websocket了,然后便找到了facebook的 SocketRock ...

  9. websocket 踩坑记录

    ssh execute command error: can't connect str to butes ssh 发送下一次指令回传的是上一次指令的结果 ssh 始终停留在 root 目录内 ssh ...

  10. spring boot整合websocket之使用自带tomcat启动项目报错记录

    项目中用到websocket,就将原来写好的websocket工具类直接拿来使用,发现前端建立连接的时候报404,经查找发现是因为原来用的是配置的外部tomcat启动,这次是spring boot自带 ...

随机推荐

  1. RocketMQ - 生产者消息发送流程

    RocketMQ客户端的消息发送通常分为以下3层 业务层:通常指直接调用RocketMQ Client发送API的业务代码. 消息处理层:指RocketMQ Client获取业务发送的消息对象后,一系 ...

  2. 我Alfred Workflow工具集合

    MyToolBox 我常用的工具箱,Alfred Workflow工具集合满足日常开发使用场景.不断完善和更新Alfred Workflow. 目前包含一下功能. 时间戳转换 unicode转中文 随 ...

  3. MySQL插入数据的多种方式

    插入数据的多种方式 replace关键字插入数据 语法: REPLACE [LOW_PRIORITY | DELAYED] [INTO] tbl_name [PARTITION (partition_ ...

  4. Quill编辑器实现原理初探

    简介 从事前端开发的同学,对富文本编辑器都不是很陌生.但是大多数富文本编辑器都是开箱即用,很少会对其实现原理进行深入的探讨.假如静下心去细细品味,会发现想要做好一款富文本编辑器,需要对整个前端生态有较 ...

  5. vue-cli 更新遇到的问题,卸载不掉旧版本2.9.6(可行)

    今天更新vue-cli时,遇到问题:卸载不掉旧版本2.9 官网给的信息是:Vue CLI 的包名称由 vue-cli 改成了 @vue/cli. 如果你已经全局安装了旧版本的 vue-cli (1.x ...

  6. select加下拉箭头

    <div class="flex"> <label>城市</label> <div class="dealerbo"& ...

  7. CF825F - String Compression

    题意:压缩字符串,把字符串分成若干个子串,每个子串可以被压缩成"循环次数 \(+\) 循环节"的形式,求最小长度. dp 求 lcp 先 \(O(n^2)\) dp 求出所有后缀对 ...

  8. ClickHouse(13)ClickHouse合并树MergeTree家族表引擎之CollapsingMergeTree详细解析

    目录 建表 折叠 数据 算法 资料分享 参考文章 该引擎继承于MergeTree,并在数据块合并算法中添加了折叠行的逻辑.CollapsingMergeTree会异步的删除(折叠)这些除了特定列Sig ...

  9. LeetCode-396 选转函数

    来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/rotate-function 题目描述 给定一个长度为 n 的整数数组 nums . 假设 ar ...

  10. 手把手教你搭建Windows 搭建Prometheus + Grafana + Jmeter可视化监控平台

    下载安装包 Prometheus windows_exporter Grafana 下载地址:https://share.weiyun.com/D9sdiWoC 工作原理 Exporter 监控工具, ...