我试图使用TooTallNate的Java-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" }))
这是我的整个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); }
}
我知道我的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
据我所知,没有身份验证或类似的连接(我没有在我的Python程序中提供任何内容)所以我不知道这个错误的来源是什么.