技术标签: spring boot 1024程序员节 websocket java框架学习
maven pom文件引入websocket依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
websocket配置类
如果不使用spring内置的tomcat,则无需配置此类
@Configuration
public class WebSocketConfig {
/**
* 支持websocket
* 如果不使用内置tomcat,则无需配置
* @return
*/
@Bean
public ServerEndpointExporter serverEndpointExporter(){
return new ServerEndpointExporter();
}
}
websocketServer
@Slf4j
@Component
@ServerEndpoint(value = "/myWebSocket")
public class MyWebSocketServer {
//用来存放每个客户端对应的MyWebSocket对象
private static CopyOnWriteArraySet<MyWebSocketServer> user = new CopyOnWriteArraySet<MyWebSocketServer>();
//与某个客户端的连接会话,需要通过它来给客户端发送数据
private Session session;
@OnOpen
public void onOpen(Session session){
this.session = session;
user.add(this);
log.info("websocket-用户 {} 连接",this.session.getId());
}
@OnClose
public void onClose(){
user.remove(this);
log.info("websocket-用户 {} 关闭连接",this.session.getId());
}
/**
* 收到客户端消息后调用的方法
* @param message 客户端发送的消息
* @param session 连接
*/
@OnMessage
public void onMessage(String message,Session session){
log.info("websocket-收到了客户端消息: {}",message);
}
@OnError
public void onError(Session session,Throwable error){
error.printStackTrace();
log.info("websocket-用户 {} 连接错误 : {}",this.session.getId(),error.toString());
}
//发送消息
public void sendMessage(String message) {
//遍历储存的Websocket
for (MyWebSocketServer webSocket : user) {
//发送
try {
webSocket.session.getBasicRemote().sendText(message);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
controller层调用websockerServer
@ApiOperation("添加备注")
@PostMapping("/remark")
@ResponseBody
public CommonResult remarkCounsel(@RequestBody @Validated SolveOrRemarkCounselDto remarkCounselDto){
opLogService.remarkCounsel(remarkCounselDto);
webSocketServer.sendMessage("有新的备注!");
return CommonResult.success(null,"备注提交成功!");
}
js代码
let websocket = null;
if ('WebSocket' in window){
websocket = new WebSocket("ws://"+ window.location.host +"/iqas-dev-zyp/myWebSocket")
}else {
$.alert('当前浏览器不支持websocket')
}
//接收到消息的回调方法
websocket.onmessage = function (event) {
console.log(event.data);
//这里写接受到消息后前端的方法逻辑...
}
//连接成功建立的回调方法
websocket.onopen = function () {
console.log("websocket onopen...");
}
//连接关闭的回调方法
websocket.onclose = function () {
console.log("websocket onclose...");
}
//连接发生错误的回调方法
websocket.onerror = function () {
console.log("websocket connect error...");
$.alert("websocket connect error...");
};
//监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
window.onbeforeunload = function () {
closeWebSocket();
}
//关闭WebSocket连接
function closeWebSocket() {
websocket.close();
}
当用户添加备注时,controller层会调用service将用户备注的信息存入数据库中,同时通知websocketServer有新的备注信息,之后前端请求数据库将备注信息展示在页面,实现当前在该页面的用户可以即时看到其他用户添加的备注。
外网无法连接到websocket,解决方案参考:
https://www.hi-linux.com/posts/42176.html
https://www.jianshu.com/p/6f15e25bbb62
https://blog.csdn.net/weixin_42364319/article/details/104274029
Python实战社群Java实战社群长按识别下方二维码,按需求添加扫码关注添加客服进Python社群▲扫码关注添加客服进Java社群▲作者丨星安果来源丨AirPython1目 标 场...
cv2库是是强大的图形处理库,在自己一边学习的同时希望通过这样的方式方便大家也在码代码的过程中对自己更好的掌握这些知识。一、cv2 的安装这里直接安装opencv-python包(非官方): pip install opencv-python二、图像的读取和写入(1)imread(img_path,flag) 读取图片,返回图片对象参数解释:img_path:图片的路径,注意,路径中慎用中文名flag:cv2.IMREAD_COLOR, 读取彩色图片,为默认参数cv2.IMREA
App开发本质上涉及到多方面的知识:html css js java php mysql.......;从底层技术开始学周期太长,并不适用,特别是对于非计算机出生的同学。本课程的目的希望能够在选择合适的开发工具的基础上,自顶向下进行学习,以尽早实现app案例开发为目标,先入门然后进行更深入的学习。当前app开发的趋势:无代码开发与低代码开发无代码开发的代表:ivx,氚云,简道云,牛刀......2021盘点:国内外10大低代码开发平台,哪个更值得一试? - 少数派低代码开发:国内工具:APICl
点击上方,选择星标或置顶,每天给你送干货!阅读大概需要11分钟跟随小博主,每天进步一丢丢作者:choose_c编辑:zenRRan链接:https://blog.csdn.net/cho...
R语言基础教程1:数据类型R语言基础教程2:散点图R语言基础教程3:曲线图、误差线和图例R语言基础教程4:柱形图R语言基础教程5:图形页面排版R语言基础教程6:程序设计基础R语言基础教程7:数据描述性统计先了解一个概念:函数。简单地说,把一些R语句(赋值、计算或其他操作步骤)包装起来并给它一个名称,这就是函数。我们前面接触过的getClass( ), class( ), head( ), rep(
当我们像往常一样登录root用户的时候,发现不是熟悉的[[email protected] ~]# 而变成了 -bash-4.2遇到这种问题的原因是不小心删除了/root文件夹下的.bash_profile与 .bashrc两个文件,这里我们只需要将这两个文件还原即可,具体操作如下:1.查看/root目录下是否有文件缺失,这里使用命令ls -a,以显示隐藏文件:2.此时我们进入系统的用户模板目录下:cd /etc/skells -a如下图3.此时只需要将这两个文件复制到/root下即可:cp
html:<!DOCTYPE html><head><meta charset="utf-8"><title></title> <meta name="renderer" content="webkit|ie-comp|ie-stand"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta name="
一、数据集:新闻文档1.数据集清华NLP组提供的THUCNews新闻文本分类数据集的一个子集(原始的数据集大约74万篇文档,训练起来需要花较长的时间)。 Train(Test)\ 类别1\ 1.txt 2.txt 3.txt ... n.txt 类别2\ ... ...
题目链接http://poj.org/problem?id=1830思路很好的一道题。。。 对于nn个开关,我们可以很容易地列出nn个nn元一次方程,每个方程如下: a1x1⊕a2x2⊕a3x3...⊕anxn=ca_1x_1⊕a_2x_2⊕a_3x_3...⊕a_nx_n=c 其中每个a、x、ca、x、c均为0或1,xi=1x_i=1表示第ii个开关按下,xi=0x_i=0表示第ii个开关没
发现在vscode里面 关于tensorflow的内容都不提示,需要一个字母一个字母的敲。搜索了一下解决方案:https://blog.csdn.net/weixin_34224941/article/details/86023757在tensorflow包下的__init__.py文件中定义了一个contrib变量表示tensorflow.contrib包下的内容,但是tensorflo...
文章目录探索5G - 5G 可能会带来哪些改变与变革1、5G 与 4G 的技术对比2、可感知的变化3、5G 主要倾向于解决的问题4、超高传输速率推动的物联网设备 IOT,无人驾驶技术5、交互形式的变更,实时 VR 技术6、5G 的一些限制和弊端探索5G - 5G 可能会带来哪些改变与变革关联阅读 探索5G - 回顾4G 给我们带来了哪些变化1、5G 与 4G 的技术对比5G 的传输频率比4G 更大带宽比4G 更大延迟比4G 更短但是最大的变化是传输路径的变化,不再需要向4G那样经过
用一个数组标记有种树的difan