手把手带你在springBoot下使用webSocke编写带参数的url接口

在springBoot下的WebSocket的含有参数方法编写

前言:在上一篇中写了什么是WebSocket点击这里,这是介绍什么是websocket,本篇讲WebSocket如何使用,在本文中我们在springBoot的项目环境下使用webSocket。

1、项目结构基本结构

手把手带你在springBoot下使用webSocke编写带参数的url接口_第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);
    }


}

你可能感兴趣的:(WebSocket,spring,boot,websocket,java)