Sto tentando di utilizzare lo Java-Websocket library by TooTallNate per creare un client websocket che riceve messaggi dallo coinbase exchange websocket stream. Sto eseguendo il porting di un programma che ho realizzato in Python su Java a causa dei colli di bottiglia di parallelizzazione in Python e, a mia conoscenza, sto facendo le stesse cose in Java come in Python. Ecco il mio codice per aprire la connessione in Python utilizzando this websocket lib (Questo funziona come previsto):Draft rifiuta l'handshake quando si utilizza la libreria java-websocket per connettersi allo streaming websocket scambio coinbase
ws = websocket.create_connection("wss://ws-feed.exchange.coinbase.com", 20)
ws.send(json.dumps({
"type": "subscribe",
"product_id": "BTC-USD"
}))
Ecco tutta la mia classe 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);
}
}
So che ci isn' Un problema assolutamente fondamentale con il mio codice Java perché funziona come previsto quando utilizzo ws: //echo.websocket.org come URI invece di wss: //ws-feed.exchange.coinbase.com. Tuttavia quando provo a connettermi a WSS: //ws-feed.exchange.coinbase.com Ottengo questo errore:
Websocket closed: draft [email protected] refuses handshake
Non v'è alcuna autenticazione o qualcosa di simile per la connessione per quanto ne so (I didn fornire alcuno nel mio programma Python), quindi sono in perdita per quanto riguarda l'origine di questo errore.
Hai provato impostando la SocketFactory di accettare tutti i certificati SSL? È così che ho risolto il problema con il mio wss –