工作空间 v3.6.5.2版本的 MD5 值为:58e65af156c65a63bf64ed2e64960853
以下内容为反编译后的 WebSocketIOLink.java 源代码,内容仅作参考
package com.zhizhangyi.platform.zpush.internal.longlink.websocket;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import com.google.common.net.HttpHeaders;
import com.zhizhangyi.platform.zpush.LongLinkInterface;
import com.zhizhangyi.platform.zpush.internal.IPushAckItem;
import com.zhizhangyi.platform.zpush.internal.longlink.ILongLinkResponse;
import com.zhizhangyi.platform.zpush.internal.longlink.socketio.engine.engineio.client.Socket;
import com.zhizhangyi.platform.zpush.internal.utils.ConnectStatus;
import com.zhizhangyi.platform.zpush.internal.utils.ErrCmdType;
import com.zhizhangyi.platform.zpush.internal.utils.ZAlarm;
import java.util.Collection;
import java.util.concurrent.TimeUnit;
import okhttp3.HttpUrl;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.WebSocket;
import okhttp3.WebSocketListener;
import okio.ByteString;
import org.json.JSONException;
import org.json.JSONObject;
public class WebSocketIOLink implements LongLinkInterface {
private ZAlarm alarm;
private boolean awaitingPong;
private LongLinkInterface.ILongLinkCallback2 callback;
private final WebSocket.Factory factory;
private final Handler handler;
private LongLinkInterface.IHeartBeatCallback heartBeatCallback;
private boolean isPingTimeout;
private int receivedPongCount;
private ILongLinkResponse responseCallback;
private int sentPingCount;
private final HttpUrl url;
private WebSocket webSocket;
private ConnectStatus status = ConnectStatus.DISCONNECT;
private int pingIntervalInSeconds = (int) TimeUnit.MINUTES.toSeconds(4);
private final class PingRunnable implements Runnable {
PingRunnable() {
}
@Override
public void run() {
if (WebSocketIOLink.this.status == ConnectStatus.DISCONNECT) {
return;
}
int i = WebSocketIOLink.this.awaitingPong ? WebSocketIOLink.this.sentPingCount : -1;
WebSocketIOLink.access$1008(WebSocketIOLink.this);
WebSocketIOLink.this.awaitingPong = true;
if (i != -1) {
WebSocketIOLink.this.isPingTimeout = true;
WebSocketIOLink.this.webSocket.cancel();
return;
}
WebSocketIOLink.this.webSocket.send("PING");
if (WebSocketIOLink.this.heartBeatCallback != null) {
WebSocketIOLink.this.heartBeatCallback.onPing();
}
WebSocketIOLink webSocketIOLink = WebSocketIOLink.this;
webSocketIOLink.alarm = new ZAlarm(new PingRunnable(), Looper.myLooper());
WebSocketIOLink.this.alarm.Start(WebSocketIOLink.this.pingIntervalInSeconds * 1000);
}
}
public WebSocketIOLink(Looper looper, WebSocket.Factory factory, String str, int i, String str2, boolean z) {
this.handler = new Handler(looper);
this.factory = factory;
this.url = new HttpUrl.Builder().scheme(z ? "https" : "http").host(str).port(i).addPathSegments(str2.startsWith("/") ? str2.substring(1) : str2).build();
}
static int access$1008(WebSocketIOLink webSocketIOLink) {
int i = webSocketIOLink.sentPingCount;
webSocketIOLink.sentPingCount = i + 1;
return i;
}
public void cleanUp() {
this.handler.removeCallbacksAndMessages(null);
ZAlarm zAlarm = this.alarm;
if (zAlarm != null) {
zAlarm.Cancel();
}
this.status = ConnectStatus.DISCONNECT;
}
public void onReadPong() {
LongLinkInterface.IHeartBeatCallback iHeartBeatCallback;
Log.i("ZPush", "onReadPong ");
this.receivedPongCount++;
this.awaitingPong = false;
if (this.status == ConnectStatus.DISCONNECT || (iHeartBeatCallback = this.heartBeatCallback) == null) {
return;
}
iHeartBeatCallback.onPong();
}
@Override
public void checkSvrConnect() {
}
@Override
public void connect() {
this.status = ConnectStatus.CONNECTING;
Request.Builder url = new Request.Builder().url(this.url);
url.addHeader(HttpHeaders.ORIGIN, "file://zpush");
this.webSocket = this.factory.newWebSocket(url.build(), new WebSocketListener() {
@Override
public void onClosed(WebSocket webSocket, int i, final String str) {
super.onClosed(webSocket, i, str);
WebSocketIOLink.this.handler.post(new Runnable() {
@Override
public void run() {
if (WebSocketIOLink.this.status != ConnectStatus.DISCONNECT) {
WebSocketIOLink.this.callback.onDisconnect("transport close");
WebSocketIOLink.this.cleanUp();
WebSocketIOLink.this.responseCallback.onResponse(ErrCmdType.kEctServerClose, str);
}
}
});
}
@Override
public void onClosing(WebSocket webSocket, int i, String str) {
webSocket.close(1000, "");
}
@Override
public void onFailure(WebSocket webSocket, final Throwable th, Response response) {
super.onFailure(webSocket, th, response);
final String message = th == null ? "null" : th.getMessage();
WebSocketIOLink.this.handler.post(new Runnable() {
@Override
public void run() {
if (WebSocketIOLink.this.status != ConnectStatus.DISCONNECT) {
ConnectStatus connectStatus = WebSocketIOLink.this.status;
WebSocketIOLink.this.cleanUp();
if (connectStatus == ConnectStatus.CONNECTING) {
WebSocketIOLink.this.callback.onConnectError("connect error", th);
WebSocketIOLink.this.responseCallback.onResponse(ErrCmdType.kEctSocketError, message);
return;
}
LongLinkInterface.ILongLinkCallback2 iLongLinkCallback2 = WebSocketIOLink.this.callback;
Object[] objArr = new Object[2];
objArr[0] = WebSocketIOLink.this.isPingTimeout ? "ping timeout" : "transport error";
objArr[1] = th;
iLongLinkCallback2.onDisconnect(objArr);
WebSocketIOLink.this.responseCallback.onResponse(ErrCmdType.kEctServerClose, message);
}
}
});
}
@Override
public void onMessage(WebSocket webSocket, final String str) {
WebSocketIOLink.this.handler.post(new Runnable() {
@Override
public void run() {
if (WebSocketIOLink.this.status != ConnectStatus.DISCONNECT) {
if ("PONG".equals(str)) {
WebSocketIOLink.this.onReadPong();
return;
}
try {
JSONObject jSONObject = new JSONObject(str);
int i = jSONObject.getInt("type");
JSONObject jSONObject2 = jSONObject.getJSONObject("data");
if (i == 1) {
if (jSONObject2.has(Socket.EVENT_HEARTBEAT)) {
long parseInt = Integer.parseInt(jSONObject2.getString(Socket.EVENT_HEARTBEAT));
if (parseInt < TimeUnit.MINUTES.toSeconds(1L)) {
parseInt = TimeUnit.MINUTES.toSeconds(1L);
}
WebSocketIOLink.this.pingIntervalInSeconds = (int) parseInt;
}
} else if (i == 2) {
IPushAckItem parse = WebSocketIOLink.this.callback.parse(jSONObject2.toString(), new Object[0]);
if (parse == null) {
WebSocketIOLink.this.responseCallback.onResponse(ErrCmdType.kEctHttpFail, "");
} else {
WebSocketIOLink.this.callback.onPush(parse);
}
} else {
throw new JSONException("illegal type: " + i);
}
} catch (Throwable th) {
th.printStackTrace();
}
}
}
});
}
@Override
public void onOpen(WebSocket webSocket, Response response) {
WebSocketIOLink.this.handler.post(new Runnable() {
@Override
public void run() {
if (WebSocketIOLink.this.status != ConnectStatus.DISCONNECT) {
WebSocketIOLink.this.status = ConnectStatus.CONNECTED;
WebSocketIOLink.this.callback.onConnect(new Object[0]);
WebSocketIOLink webSocketIOLink = WebSocketIOLink.this;
webSocketIOLink.alarm = new ZAlarm(new PingRunnable(), Looper.myLooper());
WebSocketIOLink.this.alarm.Start((int) TimeUnit.MINUTES.toMillis(1L));
}
}
});
}
@Override
public void onMessage(WebSocket webSocket, ByteString byteString) {
super.onMessage(webSocket, byteString);
}
});
}
@Override
public void disconnect(String str) {
if (this.status != ConnectStatus.DISCONNECT) {
this.webSocket.close(1000, "");
if (this.status.atLeast(ConnectStatus.CONNECTED)) {
this.callback.onDisconnect(str);
}
cleanUp();
}
}
@Override
public boolean send(String str) {
WebSocket webSocket = this.webSocket;
if (webSocket == null) {
return false;
}
return webSocket.send(str);
}
@Override
public void setHeartbeatCallback(LongLinkInterface.IHeartBeatCallback iHeartBeatCallback) {
this.heartBeatCallback = iHeartBeatCallback;
}
@Override
public void setLongLinkCallback(LongLinkInterface.ILongLinkCallback2 iLongLinkCallback2) {
this.callback = iLongLinkCallback2;
}
@Override
public void setLongLinkResponse(ILongLinkResponse iLongLinkResponse) {
this.responseCallback = iLongLinkResponse;
}
@Override
public void setProtocolEvent(Collection<String> collection) {
}
@Override
public boolean send(byte[] bArr) {
WebSocket webSocket = this.webSocket;
if (webSocket == null) {
return false;
}
return webSocket.send(ByteString.of(bArr));
}
}