首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用java-websocket库连接到coinbase exchange websocket流时,草稿拒绝握手。

使用java-websocket库连接到coinbase exchange websocket流时,草稿拒绝握手。
EN

Stack Overflow用户
提问于 2016-01-06 15:42:35
回答 3查看 5.5K关注 0票数 15

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

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

下面是我的整个Java类:

代码语言:javascript
复制
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:// with .websocket.org而不是wss://ws-feed.exchange.coinbase.com作为URI时,它可以正常工作。但是,当我尝试连接到wss://ws-feed.exchange.coinbase.com时,我收到以下错误:

代码语言:javascript
复制
Websocket closed: draft org.java_websocket.drafts.Draft_17@7ca2fefb refuses handshake

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

EN

回答 3

Stack Overflow用户

发布于 2016-06-18 01:56:09

需要创建如下所示的sslcontext。它跳过证书。我成功地在没有证书的情况下建立了连接

代码语言:javascript
复制
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());
票数 1
EN

Stack Overflow用户

发布于 2016-01-18 06:38:19

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

代码语言:javascript
复制
private CoinbaseWebsocketClient(URI serverURI) {
    super(serverURI, new Draft_17());
    setSocket(SSLSocketFactory.getDefault().createSocket(serverURI.getHost(), serverURI.getPort()));
    connect();
}

祝好运!

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

票数 0
EN

Stack Overflow用户

发布于 2016-12-07 18:36:26

vlp几乎是正确的。但应将443硬编码为端口参数:

代码语言:javascript
复制
private CoinbaseWebsocketClient(URI serverURI) {
    super(serverURI, new Draft_17());
    setSocket(SSLSocketFactory.getDefault().createSocket(serverURI.getHost(), 443));
    connect();
}

这对我很有效!

PS。ssl必须是有效证书,否则不能只使用getDefault方法获取ssl。有关自烧等信息,请参阅以下链接:

http://blog.antoine.li/2010/10/22/android-trusting-ssl-certificates/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34627959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档