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自带 ...
随机推荐
- go语言面试
go面试 基础 = 和 := 的区别? **Go语言中,= 操作符用于赋值,而 := 操作符可以用于声明及赋值. Go 语言支持短变量声明(针对局部变量),以 := 为标志,这里要注意的是,Go 语言 ...
- 代码随想录算法训练营day17 | leetcode ● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.左叶子之和
LeetCode 110.平衡二叉树 分析1.0 求左子树高度和右子树高度,若高度差>1,则返回false,所以我递归了两遍 class Solution { public boolean is ...
- 代码随想录算法训练营day11 | leetcode 20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值
基础知识 String StringBuilder 操作 public class StringOperation { int startIndex; int endIndex; { //初始容量为1 ...
- linux kali 换源细节
1.打开命令行输入sudo vim /etc/apt/sources.list,并输入密码(也许你进入终端是空白的,也是没有问题的.).这里我们用root身份进去.不然后期会报错. (E45: 're ...
- echarts来显示世界地图和全国地图,并且可以下钻层级
echarts来显示世界地图和全国地图,并且可以下钻层级 使用echarts来显示世界地图和全国地图,并且可以下钻层级 使用的技术 现有的功能 遇到的问题解决 总结 参考内容 直接来源码,地球资源包我 ...
- wibu软授权(五)
本篇将尝试根据RAU的asn1定义手动生成一份自定义的RAU文件,看看能不能通过wibu软授权系统的验证 准备工具 python3 asn1tools Ubuntu 18.04 CodeMeter R ...
- b站m4s视频混流
1.下载ffmpeg工具 https://ffmpeg.zeranoe.com/builds/ 这个网站估计是挂了. 由于 Zeranoe 已经不再编译.发布 FFMPEG,可从以下网址下载其他开发者 ...
- drf从入门到飞升仙界 08
断点调试使用 # 程序在debug模式运行,可以在任意位置停下,查看当前情况下变量数据的变化情况 # 使用pycharm调试程序 - 1.以debug模式运行. - 2.在代码左侧加入断点(红圈) - ...
- grafana嵌入iframe,去除菜单和上方工具条
1.首先修改grafana的配置:etc/grafana/grafana.ini,修改下面这两个配置为true 2.由于项目使用了nginx,要启用https,需要修改下面这几个配置:(不需要启用ht ...
- python 获取近几周日期
import datetimedef get_Next_day(count): today = datetime.datetime.today().date() for i in range(coun ...