Ik probeer een websocket verbinden op te zetten met de secure websocket feed van xBTCe. De documentatie is te vinden op https://www.xbtce.com/websocketfeedapi, de uri om te verbinden is wss://cryptottlivewebapi.xbtce.net:3020. Het probleem is dat ik in mijn Java test client nooit een onConnect event krijg. Er wordt wel een upgrade request gestuurd, maar er komt daarna niks meer terug, de verbinding is dan al verbroken.
De client is geschreven in Java 1.8.0_101 en gebruikt Jetty websocket-client 9.3.12.
Als alternatieven naast Jetty heb ik ook implementaties gemaakt met GlassFish Tyrus en met TooTallNate/Java-WebSocket. Ook die geven hetzelfde resultaat, er komt geen onConnect event.
Het vreemde is, als ik http://websocket.org/echo.html gebruik om de URL te testen, dan werkt het, direct CONNECTED. Ook via de documentatie link is het mogelijk om de websocket te testen en daar werkt het ook (connect knop rechts boven). Dus een javascript implementatie in mijn browser functioneert, een Java implementatie vanaf dezelfde machine niet. Ik heb alle request headers nagekeken die de javascript implementaties toevoegen, maar dat maakte geen verschil.
Mijn vermoeden is dat het ergens in de SSL handshake misgaat, maar daar loop ik spaak. Ook weet ik niet of het aan mijn machine ligt (Ubuntu 16.04, ook getest op Windows 10 met Java 1.8.0_91).
De client is geschreven in Java 1.8.0_101 en gebruikt Jetty websocket-client 9.3.12.
Als alternatieven naast Jetty heb ik ook implementaties gemaakt met GlassFish Tyrus en met TooTallNate/Java-WebSocket. Ook die geven hetzelfde resultaat, er komt geen onConnect event.
Het vreemde is, als ik http://websocket.org/echo.html gebruik om de URL te testen, dan werkt het, direct CONNECTED. Ook via de documentatie link is het mogelijk om de websocket te testen en daar werkt het ook (connect knop rechts boven). Dus een javascript implementatie in mijn browser functioneert, een Java implementatie vanaf dezelfde machine niet. Ik heb alle request headers nagekeken die de javascript implementaties toevoegen, maar dat maakte geen verschil.
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
| import java.net.*; import java.util.concurrent.*; import org.eclipse.jetty.util.ssl.*; import org.eclipse.jetty.websocket.api.*; import org.eclipse.jetty.websocket.api.annotations.*; import org.eclipse.jetty.websocket.client.*; public class WebSocketMain { public static void main(String[] args) throws Exception { //URI uri = new URI("wss://echo.websocket.org"); // werkt URI uri = new URI("wss://cryptottlivewebapi.xbtce.net:3020"); // werkt niet WebSocketClient webSocketClient = new WebSocketClient(new SslContextFactory()); SimpleEchoSocket simpleEchoSocket = new SimpleEchoSocket(); webSocketClient.start(); webSocketClient.connect(simpleEchoSocket, uri); simpleEchoSocket.awaitClose(5, TimeUnit.SECONDS); webSocketClient.stop(); } @WebSocket public static class SimpleEchoSocket { private CountDownLatch closeLatch = new CountDownLatch(1); public boolean awaitClose(int duration, TimeUnit unit) throws InterruptedException { return this.closeLatch.await(duration, unit); } @OnWebSocketConnect public void onWebSocketConnect(Session session) throws Exception { System.out.printf("onWebSocketConnect: %s%n", session); RemoteEndpoint remote = session.getRemote(); Future<Void> future = remote.sendStringByFuture("Hello"); future.get(2, TimeUnit.SECONDS); future = remote.sendStringByFuture("Thanks for the conversation."); future.get(2, TimeUnit.SECONDS); session.close(StatusCode.NORMAL, "I'm done"); } @OnWebSocketClose public void onWebSocketClose(int statusCode, String reason) { System.out.printf("onWebSocketClose: %d - %s%n", statusCode, reason); this.closeLatch.countDown(); // trigger latch } @OnWebSocketError public void onWebSocketError(Throwable cause) { System.out.println("onWebSocketError:"); cause.printStackTrace(); } @OnWebSocketMessage public void onWebSocketText(String message) { System.out.printf("onWebSocketText: %s%n", message); } } } |
Mijn vermoeden is dat het ergens in de SSL handshake misgaat, maar daar loop ik spaak. Ook weet ik niet of het aan mijn machine ligt (Ubuntu 16.04, ook getest op Windows 10 met Java 1.8.0_91).