创建websocket客户端调用接收另一个websocket客户端的数据

本文介绍了如何在Java中实现一个WebSocket客户端,以连接到外部服务器并转发接收到的数据。重点在于客户端的初始化、消息处理和与外部服务的交互。同时展示了如何调用外部WebSocket服务并将数据回传给本地客户端。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创建自己的websocket客户端

package com.gapf.app.v1.controller;

import com.gapf.entity.service.ext.RunService;
import com.gapf.entity.service.impl.ext.RunServiceImpl;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * 考试
 *
 * @author wyy ws://192.168.2.182:8080/api/gapf-app/webSocket/sankeRun/
 */
@ServerEndpoint("/webSocket/sankeRun/{uwbId}")
@Component
@Slf4j
public class SnakeRunWebSocket {

  @OnOpen
  public void onOpen(Session session, @PathParam("uwbId") Long uwbId) {
    log.info("客户端连接考试: {}", session.getId());
    //    session.getAsyncRemote().sendText("1111");
    RunService ex = new RunServiceImpl();
    Thread thread =
        new Thread(
            () -> {
              ex.snakeRunWebSocket(session, uwbId);
            });
    thread.start();
  }

  /**
   * 客户端关闭
   *
   * @param session session
   */
  @OnClose
  public void onClose(Session session) {
    log.info("客户端连接断开, id为:{}", session.getId());
  }

  /**
   * 发生错误
   *
   * @param throwable e
   */
  @OnError
  public void onError(Throwable throwable) {
    throwable.printStackTrace();
  }

  /**
   * 收到客户端发来消息
   *
   * @param message 消息对象
   */
  @OnMessage
  public void onMessage(String message, Session session) {
    log.info("服务端收到客户端发来的消息: {}", message);
    // 收到消息
  }
}

调用别人的websocketke客户端接收数据返回给自己的客户端

 @SneakyThrows
  @Override
  public void snakeRunWebSocket(Session session, Long uwbId) {
    CloseableHttpClient httpClient = HttpClients.createDefault();
    HttpResponse response;
    InputStream is = null;
    BufferedReader br = null;
    GaUwbMapper gaUwbMapper = SpringUtils.getBean(GaUwbMapper.class);
    MybatisRedisCache cache = SpringUtils.getBean(MybatisRedisCache.class);
    Object object = cache.getObject("uwb_token");
    String token = object.toString();
    GapfConfig bean = SpringUtils.getBean(GapfConfig.class);
    GaUwb uwb = gaUwbMapper.selectById(uwbId);
    String tag = uwb.getMac();
    //    String token = "0a8f3553a77ca193efb16ee07c35661e5d73ea65";
    // type|开头,以|分隔,选项值:coord(定位信息),sos(sos消息),power(电量信息),powerAlert(低电量报警),fenceAlert(围栏报警),passthrough(自定义透传),distanceAlert(距离报警),lifeStatus(心率), forceRemove(强拆报警)
    String type = "coord";
    String webUrl = "ws://track.ubitraq.com:8083/websocket/tag_+";
    String url = webUrl + "/tag_" + tag + "_2D" + token + "_type" + "%7c" + type;
    //    String url = "ws://192.168.2.41:8080/app/webSocket/sankeRun/1";
    try {
      WebSocketClient webSocketClient =
          new WebSocketClient(new URI(url), new Draft_6455()) {
            @Override
            public void onOpen(ServerHandshake handshakedata) {
              log.info("[websocket] 连接成功");
            }

            @Override
            public void onMessage(String message) {
              session.getAsyncRemote().sendText(message);
              log.info("[websocket] 收到消息={}", message);
            }

            @Override
            public void onClose(int code, String reason, boolean remote) {
              log.info("[websocket] 退出连接");
            }

            @Override
            public void onError(Exception ex) {
              log.info("[websocket] 连接错误={}", ex.getMessage());
            }
          };
      webSocketClient.connect();

    } catch (Exception e) {
      e.printStackTrace();
    } finally {

    }
  }
在Spring Boot中使用WebSocket作为客户端接收实时数据通常涉及以下几个步骤: 1. 添加依赖:首先,在项目的pom.xml或build.gradle文件中添加WebSocket相关的依赖,如Spring Websocket或SockJS等。对于Spring Boot,你可以使用`spring-boot-starter-websocket`。 ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> ``` 2. 配置Starter:在application.properties或application.yml中配置WebSocket支持。 ```properties server.webSocket.enabled=true ``` 3. 创建WebSocketClient:创建一个实现了`CloseableSession`接口的类,并通过`WebSocketTemplate`来操作WebSocket连接。 ```java @Autowired private WebSocketOperations webSocketOperations; public void subscribeToChannel(ChannelName channel) { StompHeaderAccessor accessor = StompHeaderAccessor.createFrameHeader(); accessor.setCommand(StompCommand.SUBSCRIBE); accessor.setDestination("/app/" + channel); this.websocketOperations.sendTextMessage(accessor.getMessage(), null); // 发送订阅请求 } ``` 4. 接收消息:在客户端,你需要监听WebSocket的消息事件,例如`MessageReceivedEvent`。 ```java @EventListener public void onMessageReceived(MessageReceivedEvent event) { String message = event.getMessage().getBody(String.class); System.out.println("Received message: " + message); } ``` 5. 关闭连接:当不再需要连接时,记得调用`close()`方法关闭WebSocket连接。 ```java @Override public void onClose(CloseReason reason) { if (reason.getCloseCode() == CloseCodes.NORMALClosure.getValue()) { log.info("Connection closed normally"); } else { log.error("Unexpected close reason: {}", reason); } webSocketOperations.close(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值