WebSocket 使用记录
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 使用记录的更多相关文章
- WebSocket学习记录
参考资料: Java后端WebSocket的Tomcat实现 基于Java的WebSocket推送 java WebSocket的实现以及Spring WebSocket 利用spring-webso ...
- python tornado websocket 多聊天室(返回消息给部分连接者)
python tornado 构建多个聊天室, 多个聊天室之间相互独立, 实现服务器端将消息返回给相应的部分客户端! chatHome.py // 服务器端, 渲染主页 --> 聊天室建立web ...
- WebSocket 学习笔记
WebSocket 学习笔记 来自我的博客 因为项目原因需要用到双工通信,所以比较详细的学习了一下浏览器端支持的 WebSocket. 并记录一些遇到的问题. 简介 WebSocket 一般是指浏览器 ...
- 接入WebSocket记录
为什么用 WebSocket 因为APP里面有个聊天功能,需要服务器主动推数据到APP.HTTP 通信方式只能由客户端主动拉取,服务器不能主动推给客户端,如果有实时的消息,要立刻通知客户端就麻烦了,要 ...
- WebSocket对象的“readyState”属性记录连接过程中的状态值
websocket的两个属性:readyState和bufferedAmount. 根据readyState属性可以判断webSocket的连接状态,该属性的值可以是下面几种: 0 :对应常量CONN ...
- 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 ...
- spring websocket集群问题的简单记录
目录 前言 解决方案 代码示例 前言 最近公司里遇到一个问题,在集群中一些websocket的消息丢失了. 产生问题的原理很简单,发送消息的服务和接收者连接的服务不是同一个服务. 解决方案 用中间件( ...
- 接入WebSocket记录 + 一些个人经验
闲扯 WebSocket 以前没用过,之前写过一篇博客是基于原生socket的(查看)比较复杂,慎入.今天另外一个APP需要接websocket了,然后便找到了facebook的 SocketRock ...
- websocket 踩坑记录
ssh execute command error: can't connect str to butes ssh 发送下一次指令回传的是上一次指令的结果 ssh 始终停留在 root 目录内 ssh ...
- spring boot整合websocket之使用自带tomcat启动项目报错记录
项目中用到websocket,就将原来写好的websocket工具类直接拿来使用,发现前端建立连接的时候报404,经查找发现是因为原来用的是配置的外部tomcat启动,这次是spring boot自带 ...
随机推荐
- vant组件,picker时间选择,自定义时间选择,实现datePacker,时间选择长期,增加长期选项,用于选择身份证到期时间等...
vant组件,picker时间选择,自定义时间选择,实现datePacker,时间选择长期,增加长期选项,用于选择身份证到期时间等... 最近项目中有个需求,datePicker选项,需要实现增加一个 ...
- 利用CRT配合VBS脚本实现自动化巡检
利用CRT配合VBS脚本实现自动化巡检 以山石防火墙巡检为例 目录 利用CRT配合VBS脚本实现自动化巡检 1 设备列表文件:list.txt 2 VBS脚本: 2022山石巡检.vbs 3 使用方式 ...
- .net core Ubuntu下docker部署(精简版)
一.首先先添加一个.netCore 项目,选择启用docker(我用的是vs2019,之前的可能需要手动点击项目添加docker支持) 没有的话需要手动添加 之后你的项目会存在这个dockerfile ...
- CentOS 搭建 samba 服务器并通过 Windows 访问
第一步 下载安装 samba.samba-client sudo yum -y install samba samba-client 终端提示安装完成 第二步 创建共享文件夹,这个文件夹到时候可以通过 ...
- 认识 C 的编译器和编译流程
GCC 的编译流程 我们写的 C 代码保存在扩展名是 .c 的文件,其实是一个纯文本文件. GCC(C 编译器之一)通过预处理器(Pre-Processing)把头文件展开到hello.i文件中. 编 ...
- Postgresql CTE解析
一.简介 WITH提供了一种方式来书写在一个大型查询中使用的辅助语句.这些语句通常被称为公共表表达式或CTE(Common Table Expressions),它们可以被看成是定义只在一个查询中存在 ...
- 公司有两台电脑,却分给一个上网ip
解决办法,只限于本公司: 电脑a和电脑b 电脑a先用ip 6.21上网,之后将ip改为其它: 电脑b改为6.21 此时两台电脑都能上网了
- REDIS基础要点
简述:redis 单实例,单进程,当线程处理用户请求数据,基于内存对数据处理.Redis默认分为0-16号库,每个库互相隔离(数据不共享) 基础复习: 1,系统中的每个进程对应有一个fd,通过网卡连接 ...
- ansible 离线部署
1.安装 python 环境 wget https://mirrors.bfsu.edu.cn/anaconda/archive/Anaconda3-2022.10-Linux-x86_64.sh s ...
- leetcode 31. 下一个排列 【时间击败 100%】 【内存击败 92.17%】
对于该题,我本来兴致勃勃地想到了两个优化,但从提交结果来看根本看不出来有什么区别,但我发4我说的都是真的 -3- 1 public void nextPermutation(int[] nums) { ...