未收到 Java 21 websocket 消息

问题描述 投票:0回答:1

为什么此代码没有收到任何消息:

public class MainClass {
    public static void main(String[] args) throws Exception {
        CountDownLatch latch = new CountDownLatch(1);
        try (HttpClient client = HttpClient.newHttpClient()) {
            client.newWebSocketBuilder()
                    .buildAsync(URI.create("wss://socket.coinex.com/v2/futures"), new WebSocketClient(latch))
                    .join();
            latch.wait();
        }
    }

    private record WebSocketClient(CountDownLatch latch) implements WebSocket.Listener {

        @Override
        public void onOpen(WebSocket webSocket) {
            System.out.println("Connected to server");

            String message = """
                    {
                        "method": "state.subscribe",
                        "params": {"market_list": ["BTCUSDT"]},
                        "id": 1
                    }
                    """;

            webSocket.sendText(message, true);
            WebSocket.Listener.super.onOpen(webSocket);
        }

        @Override
        public CompletionStage<?> onText(WebSocket webSocket, CharSequence data, boolean last) {
            System.out.println("Receive: " + data.toString());
            latch.countDown();
            return WebSocket.Listener.super.onText(webSocket, data, last);
        }

        @Override
        public CompletionStage<?> onClose(WebSocket webSocket, int statusCode, String reason) {
            System.out.println("Socket Closed: " + statusCode);
            latch.countDown();
            return WebSocket.Listener.super.onClose(webSocket, statusCode, reason);
        }

        @Override
        public void onError(WebSocket webSocket, Throwable error) {
            System.out.println("Error: " + error.getMessage());
            latch.countDown();
            WebSocket.Listener.super.onError(webSocket, error);
        }
    }
}     

我用这个命令检查连接:

websocat --uncompress-gzip --binary wss://socket.coinex.com/v2/futures
# After connect enter this message to receive response : 
{"method": "state.subscribe","params": {"market_list": ["BTCUSDT"]},"id": 1}

我知道消息应该用

onText()
方法解压缩。
但我的问题是这个方法没有从服务器接收任何数据!

CoinEx文档

java websocket java-websocket
1个回答
0
投票

如您的

websocat
命令所示,API 正在发送 binary 消息,而不是 text 消息。因此,您应该覆盖
onBinary
来处理消息,而不是
onText
。另外,正如您的
websocat
命令所示,您必须解压缩数据。你的听众可能看起来像这样:

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.net.http.WebSocket;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.CompletionStage;
import java.util.function.Consumer;
import java.util.zip.GZIPInputStream;

public class FuturesListener implements WebSocket.Listener {

  private final Consumer<String> onMessage;

  public FuturesListener(Consumer<String> onMessage) {
    this.onMessage = onMessage;
  }

  @Override
  public void onOpen(WebSocket webSocket) {
    System.out.println("onOpen");
    webSocket.sendText(
        """
          {
            "method": "state.subscribe",
            "params": {"market_list": ["BTCUSDT"]},
            "id": 1
          }
          """,
        true);
    webSocket.request(1);
  }

  @Override
  public CompletionStage<?> onBinary(WebSocket webSocket, ByteBuffer data, boolean last) {
    onMessage.accept(new String(decompress(data), StandardCharsets.UTF_8));
    webSocket.request(1);
    return null;
  }

  private byte[] decompress(ByteBuffer data) {
    byte[] buf = new byte[data.remaining()];
    data.get(buf);
    try {
      var stream = new GZIPInputStream(new ByteArrayInputStream(buf));
      return stream.readAllBytes();
    } catch (IOException ex) {
      throw new UncheckedIOException(ex);
    }
  }
}

请注意,以上省略了任何

onError
onClose
处理。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.