springboot后端用WebSocket每秒向前端传递数据,python接收数据

这篇具有很好参考价值的文章主要介绍了springboot后端用WebSocket每秒向前端传递数据,python接收数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 springboot

1.1 加依赖

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

1.2 WebSocketConfig 后端设置前端请求的网址,注册请求的信息

import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

  @Override
  public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
    registry.addHandler(new WebSocketHandler(), "/websocket")
        .setAllowedOrigins("*");
  }
}

1.3 WebSocketHandler 数据处理与推送

import com.fasterxml.jackson.databind.ObjectMapper;
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.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.Executors;

@Component
public class WebSocketHandler extends TextWebSocketHandler {

  private List<WebSocketSession> sessions = new CopyOnWriteArrayList<>();

  @Override
  public void afterConnectionEstablished(WebSocketSession session) throws Exception {
    sessions.add(session);
    System.out.println("WebSocket session opened: " + session.getId());

    // + 在这里 加入 每秒 推送的消息

    ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
    executorService.scheduleAtFixedRate(() -> {
      try {
        pushDateTimeToClients(); // 每秒调用这个方法处理数据
      } catch (IOException e) {
        e.printStackTrace();
      }
    }, 0, 1, TimeUnit.SECONDS);
  }

  @Override
  protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
    System.out.println("Received message from WebSocket client: " + message.getPayload());
  }

  @Override
  public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
    sessions.remove(session);
    System.out.println("WebSocket session closed: " + session.getId());
  }

  public void pushDateTimeToClients() throws IOException {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String dateTimeString = dateFormat.format(new Date());
    List<String> dataList = new ArrayList<>();
    dataList.add(dateTimeString);

    ObjectMapper objectMapper = new ObjectMapper();
    String payload = objectMapper.writeValueAsString(dataList);
    TextMessage message = new TextMessage(payload);
    sessions.forEach(webSocketSession -> {
      try {
        webSocketSession.sendMessage(message);
      } catch (IOException e) {
        e.printStackTrace();
      }
    });
  }
}
/**
 * afterConnectionEstablished:
 * 当WebSocket客户端连接到服务端时会触发这个方法,我们将客户端的WebSocketSession对象添加到sessions列表中。
 * handleTextMessage: 当WebSocket客户端发送消息给服务端时会触发这个方法,在这个示例中,我们暂时不需要处理这个消息。
 * afterConnectionClosed:
 * 当WebSocket客户端关闭连接时会触发这个方法,我们需要将客户端的WebSocketSession对象从sessions列表中移除。
 * pushDateTimeToClients: 这个方法用于向所有连接到WebSocket服务端的客户端推送当前的日期时间信息。
 */

/**
 * @Component: 该注解用于将WebSocketHandler类声明为Bean,使其能够被Spring容器管理,需要进行依赖注入时直接注入该类即可。
 *             TextWebSocketHandler:
 *             这是Spring框架提供的一个实现了WebSocketHandler接口的抽象类,用于处理文本类型的WebSocket消息。在实现WebSocketHandler接口时,一般继承该类并重写其中的方法。
 *             WebSocketSession:
 *             该类表示WebSocket连接的会话信息,包括连接ID、协议版本、URI等信息,可以通过该类实现向客户端发送消息等功能,也可以获取客户端发送的消息等操作。
 *             CopyOnWriteArrayList:
 *             该类是Java并发包中提供的线程安全集合类之一,其内部实现使用了可重入锁。该类提供的线程安全操作包括添加、删除、修改等,以及遍历集合元素等操作,适用于读多写少的场景。
 *             ObjectMapper:
 *             Jackson库中提供的一个用于将对象序列化为JSON格式的类。在这里用于将List对象序列化为JSON字符串。
 *             List: Java集合框架中提供的一个接口,用于表示有序、可重复的元素序列。在这里用于保存WebSocket连接会话信息。
 *             TextMessage: 表示文本类型的WebSocket消息,包括消息内容和消息头部信息等。
 */

2 python

2.1 pip

pip install websocket

pip install websocket-client

2.2 代码

import websocket
import threading
import json
import time

def on_message(ws, message):
    data_list = json.loads(message)
    print('Received DateTime: ', data_list[0])

def on_error(ws, error):
    print(error)

def on_close(ws):
    print('WebSocket closed')

def on_open(ws):
    def run(*args):
        while True:
            time.sleep(10)
            ws.send('ping')
        ws.close()
        print('Thread terminating...')

    threading.Thread(target=run).start()

if __name__ == '__main__':
    websocket.enableTrace(True)
    ws = websocket.WebSocketApp('ws://localhost:8080/websocket',
                                on_message=on_message,
                                on_error=on_error,
                                on_close=on_close)
    ws.on_open = on_open
    ws.run_forever()

'''
上述代码中确实没有打印 ++Rcv raw 和 ++Rcv decoded 的语句。这是因为在代码中使用了 websocket.enableTrace(True),启用了 WebSocket 的跟踪模式,会在控制台打印出 WebSocket 的详细信息,包括收发的字节流等信息。因此打印 ++Rcv raw 和 ++Rcv decoded 的语句是由 WebSocket 库自动生成的,不是代码中明确调用的。

如果您想禁用这些跟踪信息,只需要将 websocket.enableTrace(True) 改为 websocket.enableTrace(False) 即可。
'''

文章来源地址https://www.toymoban.com/news/detail-625083.html

到了这里,关于springboot后端用WebSocket每秒向前端传递数据,python接收数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 前端传递JSON数组数据到后端(解析方法)

            在前端和后端之间 传递数组 时,由于HTTP协议的限制,无法直接传递数组类型的参数。 请求参数需要被转换为字符串格式传递给后端,所以需要通过 JSON.stringify() 方法将 gradeIdArray 数组转换为一个 JSON 字符串,并将其作为参数传递给后端。         在后端的控

    2024年02月16日
    浏览(16)
  • 前端如何传递Array、Map类型数据到后端

    前端如何传递Array、Map类型数据到后端

    针对前后端分离的项目,避免不了前端需要传递Array、Map类型的数据到后端,那么要怎么实现这种情况的参数传递呢?请看下文分说。 前端有Map类型数据如下: 将Map类型数据转化成String,再进行传递 将前端传过来的String数据,解析为JSON对象,再强制转为java的Map 以上。本文

    2024年02月02日
    浏览(52)
  • 如何解决前端传递数据给后端时精度丢失问题

    如何解决前端传递数据给后端时精度丢失问题

    有时候我们在进行修改操作时,发现修改既不报错也不生效。我们进行排查后发现服务器端将数据返回给前端时没有出错,但是前端js将数据进行处理时却出错了,因为id是Long类型的,而js在处理后端返回给前端的Long类型数据时只能处理前16位,后3位进行了四舍五入操作,例

    2024年02月09日
    浏览(86)
  • 从前端到后端:如何在 URL 参数中传递 JSON 数据

    在 Web 开发中,我们经常需要将数据作为 URL 参数进行传递。当我们需要传递复杂的数据结构时,如何在前端将其转换为字符串,并在后端正确地解析它呢?本文将介绍如何在前端将 JSON 数据进行 URL 编码,并在后端将其解析为相应的数据类型,同时提供 Java 语言的示例代码。

    2024年02月07日
    浏览(19)
  • WebSocket实现后端数据变化,通知前端实时更新数据

    背景 ​ 项目中需要做一个消息提示功能,当有用户处理相关待办信息后,别的用户需要实时更新处理后的待办信息。 解决方案: ​ 1、使用最原始的方法,写个定时器去查询待办信息。但这种方式在大多数情况是不被允许的,它会浪费系统中的许多资源,同时也并不是完全

    2024年04月15日
    浏览(15)
  • post请求:前端传递数组到后端,后端顺利接受数组

    post请求:前端传递数组到后端,后端顺利接受数组

      可能需要解释的地方:deletePicture是一个数组。 后端采用@requestBody注解+JSONArray来接受前端数组(测试过了,确实可以接收)  ①前端采用JSON.string将对象转化为字符串 ②后端采用@requestbody注解+JSONArray类(hutool工具类里面的一个类)来接受前端传递过来的数组 一些废话:本

    2024年02月14日
    浏览(18)
  • 前端传递Json格式,后端如何用多种方式接收

     一、先定义一个简单的实体类 二、编写前端传递的json数据 1.前端传递普通json,后端用对象接收 2.前端传递json数组, 3.前端传递json数组,后端用集合接收Josn数组

    2024年02月12日
    浏览(14)
  • SpringBoot后端Long数据传到前端js精度损失问题

    在对应的字段上添加注解,将 Long 转为 String 后传输。 在 js 对应的结果接收上使用 BigInt 。

    2024年02月19日
    浏览(52)
  • formData手动上传问题前端如何传递后端如何接收

    formData手动上传问题前端如何传递后端如何接收

    参考文章: 解决Current request is not a multipart request axios上传文件错误:Current request is not a multipart reques 之前使用el-upload使用默认action表单提交.前端默认content-type为multipart/form-data.没有问题. 后期渐进式优化.修改为axios+formdata传递内容. Current request is not a multipart request 这个错误是因

    2024年02月03日
    浏览(14)
  • 小程序后端用什么开发比较好

    在小程序后端开发中,可以使用 Node.js 和一些框架进行开发。常见的框架有 Koa、Express、egg、Nest 等。这些框架都可以帮助开发者快速构建小程序后端服务。 在选择框架时,可以考虑以下几点: 文档是否丰富:丰富的文档可以帮助开发者更快地学习和使用框架。 社区是否活跃

    2024年02月07日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包