柬埔寨通 v6.1.5版本的 MD5 值为:9b68581ac30883219d6a25858a099d6b
以下内容为反编译后的 AbstractWebSocket.java 源代码,内容仅作参考
package org.java_websocket;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.Timer;
import java.util.TimerTask;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public abstract class AbstractWebSocket extends WebSocketAdapter {
private static final Logger log = LoggerFactory.getLogger((Class<?>) AbstractWebSocket.class);
private Timer connectionLostTimer;
private TimerTask connectionLostTimerTask;
private boolean reuseAddr;
private boolean tcpNoDelay;
private int connectionLostTimeout = 60;
private boolean websocketRunning = false;
private final Object syncConnectionLost = new Object();
protected abstract Collection<WebSocket> getConnections();
public int getConnectionLostTimeout() {
int i;
synchronized (this.syncConnectionLost) {
i = this.connectionLostTimeout;
}
return i;
}
public void setConnectionLostTimeout(int i) {
synchronized (this.syncConnectionLost) {
this.connectionLostTimeout = i;
if (i <= 0) {
log.trace("Connection lost timer stopped");
cancelConnectionLostTimer();
return;
}
if (this.websocketRunning) {
log.trace("Connection lost timer restarted");
try {
Iterator it = new ArrayList(getConnections()).iterator();
while (it.hasNext()) {
WebSocket webSocket = (WebSocket) it.next();
if (webSocket instanceof WebSocketImpl) {
((WebSocketImpl) webSocket).updateLastPong();
}
}
} catch (Exception e) {
log.error("Exception during connection lost restart", (Throwable) e);
}
restartConnectionLostTimer();
}
}
}
public void stopConnectionLostTimer() {
synchronized (this.syncConnectionLost) {
if (this.connectionLostTimer != null || this.connectionLostTimerTask != null) {
this.websocketRunning = false;
log.trace("Connection lost timer stopped");
cancelConnectionLostTimer();
}
}
}
public void startConnectionLostTimer() {
synchronized (this.syncConnectionLost) {
if (this.connectionLostTimeout <= 0) {
log.trace("Connection lost timer deactivated");
return;
}
log.trace("Connection lost timer started");
this.websocketRunning = true;
restartConnectionLostTimer();
}
}
private void restartConnectionLostTimer() {
cancelConnectionLostTimer();
this.connectionLostTimer = new Timer("WebSocketTimer");
TimerTask timerTask = new TimerTask() {
private ArrayList<WebSocket> connections = new ArrayList<>();
@Override
public void run() {
this.connections.clear();
try {
this.connections.addAll(AbstractWebSocket.this.getConnections());
long currentTimeMillis = System.currentTimeMillis() - (AbstractWebSocket.this.connectionLostTimeout * 1500);
Iterator<WebSocket> it = this.connections.iterator();
while (it.hasNext()) {
AbstractWebSocket.this.executeConnectionLostDetection(it.next(), currentTimeMillis);
}
} catch (Exception unused) {
}
this.connections.clear();
}
};
this.connectionLostTimerTask = timerTask;
Timer timer = this.connectionLostTimer;
int i = this.connectionLostTimeout;
timer.scheduleAtFixedRate(timerTask, i * 1000, 1000 * i);
}
public void executeConnectionLostDetection(WebSocket webSocket, long j) {
if (webSocket instanceof WebSocketImpl) {
WebSocketImpl webSocketImpl = (WebSocketImpl) webSocket;
if (webSocketImpl.getLastPong() < j) {
log.trace("Closing connection due to no pong received: {}", webSocketImpl);
webSocketImpl.closeConnection(1006, "The connection was closed because the other endpoint did not respond with a pong in time. For more information check: https://github.com/TooTallNate/Java-WebSocket/wiki/Lost-connection-detection");
} else if (webSocketImpl.isOpen()) {
webSocketImpl.sendPing();
} else {
log.trace("Trying to ping a non open connection: {}", webSocketImpl);
}
}
}
private void cancelConnectionLostTimer() {
Timer timer = this.connectionLostTimer;
if (timer != null) {
timer.cancel();
this.connectionLostTimer = null;
}
TimerTask timerTask = this.connectionLostTimerTask;
if (timerTask != null) {
timerTask.cancel();
this.connectionLostTimerTask = null;
}
}
public boolean isTcpNoDelay() {
return this.tcpNoDelay;
}
public void setTcpNoDelay(boolean z) {
this.tcpNoDelay = z;
}
public boolean isReuseAddr() {
return this.reuseAddr;
}
public void setReuseAddr(boolean z) {
this.reuseAddr = z;
}
}