Java socket 客户端,需要对socket的连接状态进行管理,以便在socket连接断开的时候,可以实现自动重新连接;通过一系列的摸索,发现客户端只有一个方法可以判断socket连接处于断开状态,就是向socket写数据。
因此客户端需要定期向服务端写数据,如果业务数据写出不是那么频繁,则插入心跳包进行写出操作,这样才能做到比较及时的感知到socket的断开(心跳包也不宜太频繁,一般在30秒一次比较靠谱)。
类:连接管理
关键API:start, stop, appendOutput
public class IMConnectionSubject {
private volatile Thread socketThread;
private SocketRunnable socketRunnable;
private final List<IMSocketEventListener> listeners = new ArrayList<>();
private final BlockingQueue<byte[]> outputQueue = new ArrayBlockingQueue<>(5000);
public void addListener(IMSocketEventListener listener) {
synchronized (this) {
listeners.add(listener);
}
}
public void removeListener(IMSocketEventListener listener) {
synchronized (this) {
listeners.remove(listener);
}
}
public void start(InetSocketAddress address) {
if (socketThread == null) {
synchronized (this) {
if (socketThread == null) {
socketRunnable = new SocketRunnable(address);
socketThread = new Thread(socketRunnable);
socketThread.start();
}
}
}
}
public void stop() {
if (socketThread != null) {
socketRunnable.notifyQuit();
try {
socketThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void appendOutput(byte[] buffer) {
outputQueue.add(buffer);
}
private class SocketRunnable implements Runnabl