replace Java-WebSocket to OkHttp WebSocket
This commit is contained in:
10
pom.xml
10
pom.xml
@@ -47,11 +47,6 @@
|
|||||||
<artifactId>json</artifactId>
|
<artifactId>json</artifactId>
|
||||||
<version>20090211</version>
|
<version>20090211</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>org.java-websocket</groupId>
|
|
||||||
<artifactId>Java-WebSocket</artifactId>
|
|
||||||
<version>1.3.0</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>junit</groupId>
|
<groupId>junit</groupId>
|
||||||
<artifactId>junit</artifactId>
|
<artifactId>junit</artifactId>
|
||||||
@@ -64,6 +59,11 @@
|
|||||||
<version>1.3</version>
|
<version>1.3</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.squareup.okhttp</groupId>
|
||||||
|
<artifactId>okhttp-ws</artifactId>
|
||||||
|
<version>2.3.0</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<distributionManagement>
|
<distributionManagement>
|
||||||
|
|||||||
@@ -6,22 +6,31 @@ import com.github.nkzawa.engineio.parser.Packet;
|
|||||||
import com.github.nkzawa.engineio.parser.Parser;
|
import com.github.nkzawa.engineio.parser.Parser;
|
||||||
import com.github.nkzawa.parseqs.ParseQS;
|
import com.github.nkzawa.parseqs.ParseQS;
|
||||||
import com.github.nkzawa.thread.EventThread;
|
import com.github.nkzawa.thread.EventThread;
|
||||||
import org.java_websocket.client.DefaultSSLWebSocketClientFactory;
|
import com.squareup.okhttp.OkHttpClient;
|
||||||
import org.java_websocket.client.WebSocketClient;
|
import com.squareup.okhttp.Request;
|
||||||
import org.java_websocket.drafts.Draft_17;
|
import com.squareup.okhttp.Response;
|
||||||
import org.java_websocket.handshake.ServerHandshake;
|
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.io.IOException;
|
||||||
import java.net.URISyntaxException;
|
import java.util.Date;
|
||||||
import java.nio.ByteBuffer;
|
import java.util.HashMap;
|
||||||
import java.util.*;
|
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 class WebSocket extends Transport {
|
||||||
|
|
||||||
public static final String NAME = "websocket";
|
public static final String NAME = "websocket";
|
||||||
|
private com.squareup.okhttp.ws.WebSocket ws;
|
||||||
private WebSocketClient ws;
|
|
||||||
|
|
||||||
|
|
||||||
public WebSocket(Options opts) {
|
public WebSocket(Options opts) {
|
||||||
super(opts);
|
super(opts);
|
||||||
@@ -37,70 +46,87 @@ public class WebSocket extends Transport {
|
|||||||
this.emit(EVENT_REQUEST_HEADERS, headers);
|
this.emit(EVENT_REQUEST_HEADERS, headers);
|
||||||
|
|
||||||
final WebSocket self = this;
|
final WebSocket self = this;
|
||||||
try {
|
final OkHttpClient client = new OkHttpClient();
|
||||||
this.ws = new WebSocketClient(new URI(this.uri()), new Draft_17(), headers, 0) {
|
if (this.sslContext != null) {
|
||||||
@Override
|
SSLSocketFactory factory = sslContext.getSocketFactory();// (SSLSocketFactory) SSLSocketFactory.getDefault();
|
||||||
public void onOpen(final ServerHandshake serverHandshake) {
|
client.setSslSocketFactory(factory);
|
||||||
EventThread.exec(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
Map<String, String> headers = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
|
|
||||||
Iterator<String> 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 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<String, String> headers = new TreeMap<String, String>(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) {
|
protected void write(Packet[] packets) {
|
||||||
@@ -110,10 +136,14 @@ public class WebSocket extends Transport {
|
|||||||
Parser.encodePacket(packet, new Parser.EncodeCallback() {
|
Parser.encodePacket(packet, new Parser.EncodeCallback() {
|
||||||
@Override
|
@Override
|
||||||
public void call(Object packet) {
|
public void call(Object packet) {
|
||||||
if (packet instanceof String) {
|
try {
|
||||||
self.ws.send((String) packet);
|
if (packet instanceof String) {
|
||||||
} else if (packet instanceof byte[]) {
|
self.ws.sendMessage(TEXT, new Buffer().writeUtf8((String) packet));
|
||||||
self.ws.send((byte[]) 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() {
|
protected void doClose() {
|
||||||
if (this.ws != null) {
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user