当使用java-websocket库连接到coinbase交换websocket流时,草稿拒绝握手

zju*_*asz 15 java websocket java-websocket

我试图使用TooTallNateJava-Websocket库来创建一个websocket客户端,它接收来自coinbase交换websocket流的消息.我正在将我用Python制作的程序移植到Java中,因为Python中存在并行化瓶颈,据我所知,我在Java中做的事情与在Python中做的相同.这是我使用这个websocket lib在Python中打开连接的代码(这可以按预期工作):

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

这是我的整个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);
}
Run Code Online (Sandbox Code Playgroud)

}

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

Websocket closed: draft org.java_websocket.drafts.Draft_17@7ca2fefb refuses handshake
Run Code Online (Sandbox Code Playgroud)

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

vlp*_*vlp 0

您需要setSocket()在执行之前调用该方法connect(),例如:

private CoinbaseWebsocketClient(URI serverURI) {
    super(serverURI, new Draft_17());
    setSocket(SSLSocketFactory.getDefault().createSocket(serverURI.getHost(), serverURI.getPort()));
    connect();
}
Run Code Online (Sandbox Code Playgroud)

祝你好运!


注意:请注意,get()如果发生任何故障,您的单例可能不是一个好主意(如果我没记错的话,客户端类在发生不可恢复的错误后将不可用,并且您必须创建一个新的客户端才能恢复)。