Websocket服务监听收发消息

目录

  • 1.pom依赖坐标
  • 2.项目配置端口和项目包名
  • 2.创建处理器
  • 3.注册处理器
  • 4.前端页面

1.pom依赖坐标

     <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>

2.项目配置端口和项目包名

application.properties

server.port=8088
//路径规范:为应用的所有servlet提供一个统一的前缀,使URL结构更加清晰和一致
server.servlet.context-path=/rxtxcommon

2.创建处理器

import com.fazecast.jSerialComm.SerialPort;
import com.groupname.rxtxcommon.service.SerialPortService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;
import java.util.List;
import java.util.Map;@Component
public class WebSocketHandler extends TextWebSocketHandler {private static Logger log = LoggerFactory.getLogger(WebSocketHandler.class);//和客户端建立连接@Overridepublic void afterConnectionEstablished(WebSocketSession session) {log.info("和客户端建立连接"+session.getId());//初始建立连接业务逻辑处理。。。。。。。。。。。。  }//和客户端断开连接@Overridepublic void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {log.info("和客户端断开连接");//断开连接业务逻辑处理。。。。。。。。。。。。super.afterConnectionClosed(session, status);	    }// 获取客户端发来的消息并响应消息@Overrideprotected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {String receObjStr = message.getPayload();log.info("sessionID==="+session.getId());//接收客户端消息进行业务逻辑处理。。。。。。。。。。。。        // 发送消息给客户端session.sendMessage(new TextMessage("字符串"));}//异常处理@Overridepublic void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {session.close(CloseStatus.SERVER_ERROR);log.error("连接异常", exception);}
}

3.注册处理器

@Configuration
@EnableWebSocket
public class WebSocketServerConfigure implements WebSocketConfigurer {@Autowiredprivate WebSocketHandler webSocketHandler;@Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {//前端用websocket建立连接registry.addHandler(webSocketHandler, "/websocket");//这是另一种方式,但是前端用SockJS建立连接
//        registry.addHandler(webSocketHandler, "/websocket").withSockJS();}
}

4.前端页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>WebSocket客户端</title><script src="https://cdn.bootcss.com/sockjs-client/0.3.4/sockjs.min.js"></script><link href="https://cdn.bootcss.com/twitter-bootstrap/4.4.1/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<style>.jumbotron {width: 100%;}#text {height: 3rem;font-size: 1rem;line-height: 3rem;margin: 1rem;}.btn {margin-right: 5px;}#connect {margin-left: 1rem;}#log {margin: 1rem 0 0 1rem;}</style>
<div class="container"><div class="row"><div class="jumbotron"><input type="text" placeholder="请输入你想传输的内容" id="text" class="col-lg-12"/><input type="button" value="连接" class="btn btn-info" id="connect" onclick="connect()"/><input type="button" value="发送" class="btn btn-success" id="sent" disabled="disabled" onclick="sent()"/><input type="button" value="断开" class="btn btn-danger" id="disconnect" disabled="disabled"onclick="disconnect()"/><div id="log"><p>聊天记录:</p></div><input type="button" value="" class="btn btn-success" id="openCom" disabled="disabled"onclick="getCommSer()"/></div></div>
</div>
<script type="text/javascript">let text = document.querySelector('#text');let connectBtn = document.querySelector("#connect");let sentBtn = document.querySelector("#sent");let disconnectBtn = document.querySelector("#disconnect");let logDiv = document.querySelector("#log");let ws = null;function connect(operNum) {debugger//rxtxcommon是springboot项目的包名//application.properties//server.port=8088//server.servlet.context-path=/rxtxcommon        ws = new WebSocket("ws://localhost:8088/rxtxcommon/websocket")       ws.onopen = function () {//如果与后端websocket成功建立连接那么onopen 函数会触发setConnected(true);log('和服务端连接成功!');};// 监听服务端返回的消息ws.onmessage = function(event) {console.log("测试接收服务器信息"+event)log('收到服务端消息:' + event.data);};}function sent() {if (ws != null) {ws.send(text.value);log('客户端说:' + text.value);} else {log('请先建立连接!')}}function disconnect() {if (ws != null) {ws.close();ws = null;}setConnected(false);}function log(value) {let content = document.createElement('p');content.innerHTML = value;logDiv.appendChild(content);text.value = '';}function setConnected(connected) {connectBtn.disabled = connected;disconnectBtn.disabled = !connected;sentBtn.disabled = !connected;}</script>
</body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/749728.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用“Docker registry创建本地仓库,在服务器之间进行文件push和pull”?

1.1、在服务器1&#xff0c;运行registry docker run -d -p 5000:5000 -v ${PWD}/registry:/var/lib/registry --restart always --name registry registry:2.7.11.2、编辑/etc/docker/daemon.json 文件&#xff0c; 192.168.xxx.xxx 换成你自己 registry 服务的地址 sudo na…

印度交易所股票行情数据API接口

1. 历史日线 # Restful API https://tsanghi.com/api/fin/stock/XNSE/daily?token{token}&ticker{ticker}默认返回全部历史数据&#xff0c;也可以使用参数start_date和end_date选择特定时间段。 更新时间&#xff1a;收盘后3~4小时。 更新周期&#xff1a;每天。 请求方式…

mysql用 法like concat()

对于mysql 的 like 而言&#xff0c;一般都要用 like concat() 组合&#xff0c;可以防止sql注入 所以用未注释掉的呢种方式会比较好&#xff0c;不推荐直接用like的方式 。 like concat(%/,#{datePath,jdbcTypeVARCHAR},/%) concat函数&#xff1a; 第…

下载程序到嵌入式开发板教程

一、设置共享目录 ubuntu与Window共同拥有的目录。 第一步&#xff1a;在Windows下创建一个文件夹share 第二部&#xff1a;点击虚拟机--->设置--->选项--->共享文件夹 进入共享目录的命令&#xff1a;cd/mnt/hgfs/share 二、C语言编译器 使用Linux平台下的gcc编…

MyBatis Plus(代码生成器)

一、安装 安装MyBatisPlus插件 二、配置 1、 在生成代码之前首先需要配置所要连接的数据库 下面所对应的分别是&#xff1a; 所要连接的数据库 数据库驱动 用户名 密码 2、 点击Other->Code Generator 开始配置所需选项

实现加一天的操作

编写一个日期类&#xff0c;要求按xxxx-xx-xx 的格式输出日期&#xff0c;实现加一天的操作。 输入输出格式 输入描述: 输入第一行表示测试用例的个数m&#xff0c;接下来m行每行有3个用空格隔开的整数&#xff0c;分别表示年月日。测试数据不会有闰年。 输出描述: 输出m行。…

【NR 定位】3GPP NR Positioning 5G定位标准解读(十四)-DL-TDOA 定位

前言 3GPP NR Positioning 5G定位标准&#xff1a;3GPP TS 38.305 V18 3GPP 标准网址&#xff1a;Directory Listing /ftp/ 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;一&#xff09;-CSDN博客 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;…

基于卷积神经网络实现手写数字识别

基于卷积神经网络实现手写数字识别 基于卷积神经网络实现手写数字识别。具体过程如下&#xff1a; &#xff08;1&#xff09; 定义ConvNet结构类及其前向传播方式 &#xff08;2&#xff09; 设置超参数以及导入相关的包。 &#xff08;3&#xff09; 定义训练网络函数和绘…

备战蓝桥杯Day28 - 拼接最大数字问题

问题描述 有n个非负整数&#xff0c;将其按照字符串拼接的方式拼接为一个整数如何拼接可以使得得到的整数最大? 例: 32,94,128,1286,6,71可以拼接除的最大整数为 94716321286128。 问题思路 1.比较两个字符串的第一个数字&#xff0c;数值大的在前面&#xff0c;数值小的在…

MATLAB中的数据类型,例如double,char,logical等。

在MATLAB中创建和操作矩阵是MATLAB编程的基础&#xff0c;因为MATLAB本身就是一个以矩阵为基本数据单位的编程环境。下面将详细解释如何在MATLAB中创建和操作矩阵。 创建矩阵 在MATLAB中&#xff0c;创建矩阵的基本方法是将数据按行输入&#xff0c;元素之间用空格或逗号分隔…

桌面待办,电脑桌面待办事项便利贴怎么搞的

电脑桌面待办事项贴便利&#xff0c;是一款非常实用的小工具&#xff0c;可以帮助我们高效管理工作和生活中的各种任务。通过简单的操作&#xff0c;你可以在电脑桌面上添加待办事项&#xff0c;随时提醒自己完成任务&#xff0c;提高工作效率。那么&#xff0c;桌面待办&#…

Hack The Box-Jab

目录 信息收集 nmap enum4linux 服务信息收集 Pidgin kerbrute hashcat 反弹shell & get user 提权 系统信息收集 端口转发 漏洞利用 get root 信息收集 nmap 端口探测┌──(root㉿ru)-[~/kali/hackthebox] └─# nmap -p- 10.10.11.4 --min-rate 10000 -oA…

vitepress里使用gitalk(图文教程)

vitepress里使用gitalk Gitalk 是一个基于 GitHub Issue 和 Preact 开发的评论插件 生成client配置 创建OAuth application 填写完毕&#xff0c;点击 Register application 即可 生成client secrets 一开始没有自动生成 Client secrets&#xff0c;需要手动生成&#xff…

Day17 深入类加载机制

Day17 深入类加载机制 文章目录 Day17 深入类加载机制一、初识类加载过程二、深入类加载过程三、利用类加载过程理解面试题四、类加载器五、类加载器分类六、类加载器之间的层次关系七、双亲委派模型 - 概念八、双亲委派模型 - 工作过程九、双亲委派模型 - 好处十、双亲委派原则…

MySQL:视图

1. 概述 在MySQL中&#xff0c;视图&#xff08;View&#xff09;是一个虚拟存在的表&#xff0c;其内容是由查询定义的。视图本身并不包含数据&#xff0c;它只包含一条SQL查询语句&#xff08;即定义视图的SELECT语句&#xff09;。当通过视图访问数据时&#xff0c;MySQL会执…

【软考高项】八、信息技术发展之新一代信息技术及应用

1、物联网 定义&#xff1a;通过信息传感设备&#xff0c;按约定的协议将任何物品与互联网相连接&#xff0c;进行信息交换和通信&#xff0c;以实现智能化识别、定位、跟踪、监控和管理的网络 分层&#xff1a; 感知层---各种传感器构成 网络层---物联网的中枢&#xff0c…

西门子TIA中配置Anybus PROFINET IO Slave 模块

1、所需产品 Siemens S7 PLC CPU 315-2 PN/DP 6ES7 315-2EH-0AB0 Siemens PLC 编程电缆 n.a. n.a. PC ,并安装Siemens PLC编程软件 TIA Portal V11 X-gateway Slave 接口的GSDML文件 根据网关的软件版本而定 Anybus Communicator GSD文件 GSDML-V1.0-HMS-ABCPRT-20050317.xl…

win下 VirtualBox 自动启动脚本脚本

文章目录 一、找到VBoxManage二、测试脚本1、打开cmd2、输入命令 (直接把上面找到的VBoxManage.exe 拖入到cmd中&#xff0c;这样就不用输入路径了)3、效果展示 比如虚拟机中的系统名称叫“centos-mini” 三、设置自动启动脚本1、复制刚才测试好的命令到新建文本中2、修改文本名…

Golang实现Redis分布式锁(Lua脚本+可重入+自动续期)

Golang实现Redis分布式锁&#xff08;Lua脚本可重入自动续期&#xff09; 1 概念 应用场景 Golang自带的Lock锁单机版OK&#xff08;存储在程序的内存中&#xff09;&#xff0c;分布式不行 分布式锁&#xff1a; 简单版&#xff1a;redis setnx》加锁设置过期时间需要保证原…

P8706 [蓝桥杯 2020 省 AB1] 解码 Python

[蓝桥杯 2020 省 AB1] 解码 题目描述 小明有一串很长的英文字母&#xff0c;可能包含大写和小写。 在这串字母中&#xff0c;有很多连续的是重复的。小明想了一个办法将这串字母表达得更短&#xff1a;将连续的几个相同字母写成字母 出现次数的形式。 例如&#xff0c;连续…