2016-01-06 5 views
15

coinbase exchange websocket streamからメッセージを受け取るwebsocketクライアントを作成するためにJava-Websocket library by TooTallNateを使用しようとしています。 Pythonで並列化のボトルネックが発生しているため、私はPythonで作成したプログラムをJavaに移植しています。私はPythonの場合と同じようにJavaで同じことをしています。ここでthis websocket libを使用してPythonでの接続を開くために私のコードは、(これは期待通りに動作します)です。ここでドラフトはjava-websocketライブラリを使用してcoinbase交換用websocketストリームに接続するときにハンドシェイクを拒否します

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); 
} 

}

私は「そこにISN知っています私のJavaコードの根本的な問題は、wss://ws-feed.exchange.coinbase.comではなくws://echo.websocket.orgをURIとして使用すると期待通りに機能するからです。私は、WSSに接続しようとするときしかし:私が知っているようには認証または限り、この接続のようなものはありません

Websocket closed: draft [email protected] refuses handshake 

(私はdidnの:私はこのエラーを取得する//ws-feed.exchange.coinbase.com私のPythonプログラムでは何も提供していないので)、このエラーの原因を紛失しています。

+0

は、すべてのSSL証明書を受け入れることのSocketFactoryを設定しようとしたことがありますか?それで私は(馬鹿げた)私のwss問題を修正したのです –

答えて

0

あなたは例えば、connect()を行う前にsetSocket()メソッドを呼び出す必要があります。:

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

幸運!


注:お使いのシングルトンget()はどんな障害が発生した場合には良い考えではないかもしれないことに注意してください(私の記憶が正しければ、クライアントクラスが回復不能なエラーが発生した後に使用不可能であり、あなたが回復する新しいクライアントを作成する必要があります) 。

1

以下のように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()); 
+0

これは質問に対する答えではありません。助けが必要な場合は、新しい質問を投稿してください。 –

+0

はい、私は他人の投稿にコメントすることはできません。 – Prakash

+0

新しい質問ではなく、コメントでなければなりません。あなたは15担当者 –

0

VLPはほとんど右である証明書なしで接続を行うことに成功しました。私の作品

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/

関連する問題