在springBoot下的WebSocket的含有参数方法编写
前言:在上一篇中写了什么是WebSocket点击这里,这是介绍什么是websocket,本篇讲WebSocket如何使用,在本文中我们在springBoot的项目环境下使用webSocket。
1、项目结构基本结构
如上图所示,我们所需要的主要是以上三个文件
-
config文件主要是放WebSocketConfig配置文件,这文件主要是将websocket引入到项目中;
-
controller文件主要是放websocket编写的url接口信息
-
service文件主要是放业务信息。
当然,这里只是简单的样例,如果需要读数据库等信息,那肯定要有mapper、Entity等文件夹及相关文件
2、具体操作步骤
这里主要是拿我以及运行的项目进行展示,当然部分内容进行了修改,注释应该是比较详细的,如果有问题,可以问我。
2.1 首先引入依赖
在pom.xml文件中加入以下信息方便引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
2.2 编写配置文件
在 config文件夹中编写WebSocketConfig.java文件,用于开启WebSocket支持
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
// 开启WebSocket支持
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
2.3 编写Controller文件
在controller文件夹中编写TestController.java文件,进行相关url接口信息的编写
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import websocket.service.TestService;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.Timer;
import java.util.TimerTask;
/**
* @Description
* @Autor husir
* @Date 2022/1/4 20:47
* @Version 1.0
**/
@Slf4j
@Component
@ServerEndpoint(value = "/test/ws/test/{id}")
public class TestController {
public static TestService testService;
//与某个客户端的连接会话,需要通过它来给客户端发送数据
private Session session;
private Timer timer;
private static int count;
//自动注入service业务文件,这个一定要写入进去
@Autowired
public void setBeltService(TestService testService) {
TestController.testService=testService ;
}
@OnOpen
public void onOpen(Session session,@PathParam("id") Integer id) {
this.session = session;
log.info("请求开始");
try {
sendData(id);
} catch (Exception e) {
e.printStackTrace();
}
}
@OnClose
public void onClose() {
log.info("用户退出");
timer.cancel();
}
//发送数据的核心函数
public void sendData(@PathParam("id") Integer id) throws Exception {
TestController testController =this;
//问题出现在这,已经解决,注入问题
timer =new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
try {
//调用service文件中的函数进行信息的调用
JSON object= testService.getBeltInfoById(id);
//这一步是向前端发送信息,较为重要 testController.session.getBasicRemote().sendText(object.toJSONString());
} catch (Exception e) {
e.printStackTrace();
}
}
},0,3000); // 每隔3000单位发送一次
}
// 收到客户端消息后调用的方法
@OnMessage
public void onMessage(String message, Session session) {
log.info("用户消息: "+ message);
if(StringUtils.isNotBlank(message)){
try {
System.out.println("TODO!");
//解析发送的报文
// JSONObject jsonObject = JSON.parseObject(message);
}catch (Exception e){
e.printStackTrace();
}
}
}
// 出错时调用的方法
@OnError
public void onError(Session session, Throwable error) {
log.error("用户错误! 原因:" + error.getMessage());
error.printStackTrace();
}
}
这个文件的内容,webSocket协议方式的核心内容:
基本的逻辑信息是:
-
首先我们需要注入service文件,
-
使用@OnOpen注解去定义onOpen函数,当前端调用url的时候,首先会调用onOpen函数去确认连接,
-
并调用其中的sendData函数调用service文件去给前端发送数据,sendData里面的testController.session.getBasicRemote().sendText(object.toJSONString());是用来给前端发信息。
-
若收到前端发的消息会调用onMessage函数在后端显示,
-
前端断开连接的时候会调用onClose函数
-
出现错误调用onError函数
2.4 业务信息的编写
这一步是编写service文件中的TestService.java业务文件内容,主要是业务信息,业务信息根据自己的需要进行编写,在此展示一个样板
import com.alibaba.fastjson.JSON;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.filter.PageFilter;
import org.apache.hadoop.hbase.util.Bytes;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* @Description
* @Autor husir
* @Date 2022/1/4 20:16
* @Version 1.0
**/
@Service
public class TestService {
//注入需要的service文件,有几个service文件就需要加入几个 @Autowired
@Autowired
HBaseTemplate hBaseTemplate;
@Autowired
TestService testService;
public JSON getBeltInfoById(Integer subEquipmentId) throws Exception {
业务内容
return (JSON) JSON.toJSON(MpInfos);
}
}