java - 使用 java-websocket 库连接到 coinbase exchange websocket 流时,Draft 拒绝握手

标签 java websocket java-websocket

我正在尝试使用 Java-Websocket library by TooTallNate创建一个从 coinbase exchange websocket stream 接收消息的 websocket 客户端.由于 Python 中的并行化瓶颈,我正在将我用 Python 编写的程序移植到 Java,据我所知,我在 Java 中做的事情与在 Python 中做的一样。这是我使用 this websocket lib 在 Python 中打开连接的代码(这按预期工作):

ws = websocket.create_connection("wss://ws-feed.exchange.coinbase.com", 20)
            ws.send(json.dumps({
            "type": "subscribe",
            "product_id": "BTC-USD"
        }))

这是我的整个 Java 类:

public class CoinbaseWebsocketClient extends WebSocketClient {

private final Gson gson = new Gson();

private CoinbaseWebsocketClient(URI serverURI) {
    super(serverURI, new Draft_17());
    connect();
}

private static URI uri;
private static CoinbaseWebsocketClient coinbaseWebsocketClient;

static {
    try {
        uri = new URI("wss://ws-feed.exchange.coinbase.com");
    } catch (URISyntaxException e) {
        e.printStackTrace();
    }
}

protected static CoinbaseWebsocketClient get() {
    if (coinbaseWebsocketClient == null) {
        coinbaseWebsocketClient = new CoinbaseWebsocketClient(uri);
    }
    return coinbaseWebsocketClient;
}

@Override
public void onOpen(ServerHandshake serverHandshake) {
    System.out.println("Websocket open");
    final JsonObject btcUSD_Request = new JsonObject();
    btcUSD_Request.addProperty("type", "subscribe");
    btcUSD_Request.addProperty("product_id", "BTC_USD");
    final String requestString = gson.toJson(btcUSD_Request);
    send(requestString);
}

@Override
public void onMessage(String s) {
    System.out.println("Message received: " + s);
}

@Override
public void onClose(int code, String reason, boolean remote) {
    System.out.println("Websocket closed: " + reason);
}

@Override
public void onError(Exception e) {
    System.err.println("an error occurred:" + e);
}

我知道我的 Java 代码没有完全根本性的问题,因为当我使用 ws://echo.websocket.org 而不是 wss://ws-feed.exchange.coinbase 作为 URI 时,它按预期工作.com。但是,当我尝试连接到 wss://ws-feed.exchange.coinbase.com 时,出现此错误:

Websocket closed: draft org.java_websocket.drafts.Draft_17@7ca2fefb refuses handshake

据我所知,这个连接没有身份验证或类似的东西(我没有在我的 Python 程序中提供任何东西)所以我不知道这个错误的来源是什么。

最佳答案

需要像下面这样创建 sslcontext。它跳过证书。我可以在没有证书的情况下成功建立连接

SSLContext sslContext = SSLContext.getInstance("SSL");

// set up a TrustManager that trusts everything
sslContext.init(null, new TrustManager[] { new X509TrustManager() {
            public X509Certificate[] getAcceptedIssuers() {
                    System.out.println("getAcceptedIssuers =============");
                    return null;
            }

            public void checkClientTrusted(X509Certificate[] certs,
                            String authType) {
                    System.out.println("checkClientTrusted =============");
            }

            public void checkServerTrusted(X509Certificate[] certs,
                            String authType) {
                    System.out.println("checkServerTrusted =============");
            }
} }, new SecureRandom());

关于java - 使用 java-websocket 库连接到 coinbase exchange websocket 流时,Draft 拒绝握手,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34627959/

相关文章:

java - 从容器的实例中删除组件是否保留在内存中?

java - 打印列表中所有启用的项目

http - 使用 HTTP 集成从 AWS Api Gateway 中的 websocket 中提取 websocket 连接 ID 和其他详细信息

java - 访问根级系统文件夹Android

java - 无法连接到 Pentaho Kettle 中的 PostgreSQL 数据库

java - java websockets 中的 System.out.println

java - Websocket + 漂亮面孔 = AbstractMethodError

java - 如何检查 Websocket 连接是否有效

json - 为什么在 node.js 中 JSON 比 BSON 快?

apache - 在 Apache Web Server 前配置 NGINX Reverse Proxy