2016-01-06 12 views
15

से कनेक्ट करने के लिए जावा-वेबस्केट लाइब्रेरी का उपयोग करते समय ड्राफ्ट ने हैंडशेक से इंकार कर दिया है। मैं से संदेश प्राप्त करने वाले वेबस्केट क्लाइंट को बनाने के लिए Java-Websocket library by TooTallNate का उपयोग करने का प्रयास कर रहा हूं। मैं पाइथन में समानांतर बाधाओं के कारण पाइथन में जावा में किए गए एक प्रोग्राम को पोर्ट कर रहा हूं और मेरे ज्ञान के लिए मैं जावा में चीजों को वही कर रहा हूं जैसा मैंने पाइथन में किया था।क्राफ्टबेस एक्सचेंज वेबसाईट स्ट्रीम

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

यहाँ अपने पूरे जावा वर्ग है:

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 'यहां अजगर में कनेक्शन this websocket lib का उपयोग कर खोलने के लिए मेरे कोड (यह रूप में की उम्मीद काम करता है) है मेरे जावा कोड के साथ एक पूरी तरह से मौलिक मुद्दा नहीं है क्योंकि यह ws: //echo.websocket.org को wss: //ws-feed.exchange.coinbase.com के बजाय यूआरआई के रूप में उपयोग करते समय अपेक्षित काम करता है। लेकिन जब मैं WSS कनेक्ट करने का प्रयास:

Websocket closed: draft [email protected] refuses handshake 

कोई प्रमाणीकरण या इस कनेक्शन के लिए ऐसा कुछ जहाँ तक मुझे पता है (मैं नहीं था: //ws-feed.exchange.coinbase.com मैं इस त्रुटि मिलती है मेरे पायथन प्रोग्राम में कोई भी प्रदान नहीं करता है) इसलिए मुझे इस त्रुटि का स्रोत क्या है इस नुकसान के कारण।

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

वह मेरे लिए काम करता है!

पी एस। एसएसएल एक वैध प्रमाण पत्र होना चाहिए, अन्यथा आप एसएसएल संदर्भ प्राप्त करने के लिए getDefault विधि का उपयोग नहीं कर सकते हैं। आत्म singed के लिए, आदि नीचे दिए गए लिंक का संदर्भ लें:

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

संबंधित मुद्दे