diff --git a/pom.xml b/pom.xml index 9c4f82d..735d9b5 100644 --- a/pom.xml +++ b/pom.xml @@ -47,11 +47,6 @@ json 20090211 - - org.java-websocket - Java-WebSocket - 1.3.0 - junit junit @@ -64,6 +59,11 @@ 1.3 test + + com.squareup.okhttp + okhttp-ws + 2.3.0 + diff --git a/src/main/java/com/github/nkzawa/engineio/client/transports/WebSocket.java b/src/main/java/com/github/nkzawa/engineio/client/transports/WebSocket.java index f7a8c88..39bb458 100644 --- a/src/main/java/com/github/nkzawa/engineio/client/transports/WebSocket.java +++ b/src/main/java/com/github/nkzawa/engineio/client/transports/WebSocket.java @@ -6,22 +6,31 @@ import com.github.nkzawa.engineio.parser.Packet; import com.github.nkzawa.engineio.parser.Parser; import com.github.nkzawa.parseqs.ParseQS; import com.github.nkzawa.thread.EventThread; -import org.java_websocket.client.DefaultSSLWebSocketClientFactory; -import org.java_websocket.client.WebSocketClient; -import org.java_websocket.drafts.Draft_17; -import org.java_websocket.handshake.ServerHandshake; +import com.squareup.okhttp.OkHttpClient; +import com.squareup.okhttp.Request; +import com.squareup.okhttp.Response; +import com.squareup.okhttp.ws.WebSocket.PayloadType; +import com.squareup.okhttp.ws.WebSocketCall; +import com.squareup.okhttp.ws.WebSocketListener; -import java.net.URI; -import java.net.URISyntaxException; -import java.nio.ByteBuffer; -import java.util.*; +import java.io.IOException; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.TreeMap; + +import javax.net.ssl.SSLSocketFactory; + +import okio.Buffer; +import okio.BufferedSource; + +import static com.squareup.okhttp.ws.WebSocket.PayloadType.BINARY; +import static com.squareup.okhttp.ws.WebSocket.PayloadType.TEXT; public class WebSocket extends Transport { public static final String NAME = "websocket"; - - private WebSocketClient ws; - + private com.squareup.okhttp.ws.WebSocket ws; public WebSocket(Options opts) { super(opts); @@ -37,70 +46,87 @@ public class WebSocket extends Transport { this.emit(EVENT_REQUEST_HEADERS, headers); final WebSocket self = this; - try { - this.ws = new WebSocketClient(new URI(this.uri()), new Draft_17(), headers, 0) { - @Override - public void onOpen(final ServerHandshake serverHandshake) { - EventThread.exec(new Runnable() { - @Override - public void run() { - Map headers = new TreeMap(String.CASE_INSENSITIVE_ORDER); - Iterator it = serverHandshake.iterateHttpFields(); - while (it.hasNext()) { - String field = it.next(); - if (field == null) continue; - headers.put(field, serverHandshake.getFieldValue(field)); - } - self.emit(EVENT_RESPONSE_HEADERS, headers); - - self.onOpen(); - } - }); - } - @Override - public void onClose(int i, String s, boolean b) { - EventThread.exec(new Runnable() { - @Override - public void run() { - self.onClose(); - } - }); - } - @Override - public void onMessage(final String s) { - EventThread.exec(new Runnable() { - @Override - public void run() { - self.onData(s); - } - }); - } - @Override - public void onMessage(final ByteBuffer s) { - EventThread.exec(new Runnable() { - @Override - public void run() { - self.onData(s.array()); - } - }); - } - @Override - public void onError(final Exception e) { - EventThread.exec(new Runnable() { - @Override - public void run() { - self.onError("websocket error", e); - } - }); - } - }; - if (this.sslContext != null) { - this.ws.setWebSocketFactory(new DefaultSSLWebSocketClientFactory(this.sslContext)); - } - this.ws.connect(); - } catch (URISyntaxException e) { - throw new RuntimeException(e); + final OkHttpClient client = new OkHttpClient(); + if (this.sslContext != null) { + SSLSocketFactory factory = sslContext.getSocketFactory();// (SSLSocketFactory) SSLSocketFactory.getDefault(); + client.setSslSocketFactory(factory); } + final Request request = new Request.Builder() + .url(uri()) + .build(); + WebSocketCall.create(client, request).enqueue(new WebSocketListener() { + @Override + public void onOpen(com.squareup.okhttp.ws.WebSocket webSocket, Request request, Response response) throws IOException { + ws = webSocket; + final Map headers = new TreeMap(String.CASE_INSENSITIVE_ORDER); + for (int i = 0, size = response.headers().size(); i < size; i++) { + headers.put(response.headers().name(i), response.headers().value(i)); + } + EventThread.exec(new Runnable() { + @Override + public void run() { + self.emit(EVENT_RESPONSE_HEADERS, headers); + self.onOpen(); + } + }); + } + + @Override + public void onMessage(BufferedSource payload, PayloadType type) throws IOException { + Object data; + switch (type) { + case TEXT: + data = payload.readUtf8(); + break; + case BINARY: + data = payload.readByteArray(); + break; + default: + throw new IllegalStateException("Unknown payload type: " + type); + } + payload.close(); + final Object finalData = data; + EventThread.exec(new Runnable() { + @Override + public void run() { + if (finalData == null) { + return; + } + if (finalData instanceof String) { + self.onData((String) finalData); + } else { + self.onData((byte[]) finalData); + } + } + }); + + } + + @Override + public void onPong(Buffer payload) { + } + + @Override + public void onClose(int code, String reason) { + EventThread.exec(new Runnable() { + @Override + public void run() { + self.onClose(); + } + }); + } + + @Override + public void onFailure(final IOException e) { + EventThread.exec(new Runnable() { + @Override + public void run() { + self.onError("websocket error", e); + } + }); + } + }); + client.getDispatcher().getExecutorService().shutdown(); } protected void write(Packet[] packets) { @@ -110,10 +136,14 @@ public class WebSocket extends Transport { Parser.encodePacket(packet, new Parser.EncodeCallback() { @Override public void call(Object packet) { - if (packet instanceof String) { - self.ws.send((String) packet); - } else if (packet instanceof byte[]) { - self.ws.send((byte[]) packet); + try { + if (packet instanceof String) { + self.ws.sendMessage(TEXT, new Buffer().writeUtf8((String) packet)); + } else if (packet instanceof byte[]) { + self.ws.sendMessage(BINARY, new Buffer().write((byte[]) packet)); + } + } catch (IOException e) { + e.printStackTrace(); } } }); @@ -139,7 +169,11 @@ public class WebSocket extends Transport { protected void doClose() { if (this.ws != null) { - this.ws.close(); + try { + this.ws.close(1000, ""); + } catch (IOException e) { + e.printStackTrace(); + } } } @@ -173,4 +207,4 @@ public class WebSocket extends Transport { return true; } -} +} \ No newline at end of file