gpt4 book ai didi

java - 断开连接/错误时清除 socket.io 缓冲区

转载 作者:行者123 更新时间:2023-12-03 11:54:00 32 4
gpt4 key购买 nike

1) 在断开连接模式下,我正在向服务器发送一些数据,但出现套接字错误时,我显示消息“请检查您的互联网连接,然后重试”。

2) 当套接字重新连接时,它正在向服务器发送步骤 1 数据(根据功能,它应该被丢弃)。

我不知道关闭/断开连接是否会清除缓冲区,我也想在连接可用时自动重新连接。我正在创建 Android 应用程序并使用 socket.io。

最佳答案

这是一种对我有用的执行方法,它可能有点棘手,是的,这里的代码是我在 StackOverflow 上找到的几个答案的组合。

我使用的技巧是关闭套接字,将其设为 NULL,然后重新创建并尝试连接它。它有助于清除缓冲区并以平稳的方式重新连接。

ackMessageTimeOut = new AckMessageTimeOut(5000) {
@Override
public void call(Object... args) {
if (args != null) {
if (args[0].toString().equalsIgnoreCase("No Ack")) {
Log.d("ACK_SOCKET", "AckWithTimeOut : " + args[0].toString());
acknowledgeMessage(null);
if (socket != null) {
socket.close();
socket = null;
connectSocket(); // Custom method which creates the socket and tries to connect it.
}
} else if (args[0].toString().equalsIgnoreCase("true")) {
cancelTimer(); //cancel timer if emit ACK return true
Log.d("ACK_SOCKET", "AckWithTimeOut : " + args[0].toString());
}
}
}
};

socket.emit("sendMessage", message, ackMessageTimeOut); // You can apply it on whatever event you want.

AckMessageTimeOut 类如下:

private class AckMessageTimeOut implements Ack {

private Timer timer;
private long timeOut = 0;
private boolean called = false;

AckMessageTimeOut(long timeout_after) {
if (timeout_after <= 0)
return;
this.timeOut = timeout_after;
startTimer();
}

private void startTimer() {
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
callback("No Ack");
}
}, timeOut);
}

private void resetTimer() {
if (timer != null) {
timer.cancel();
startTimer();
}
}

void cancelTimer() {
if (timer != null)
timer.cancel();
}

void callback(Object... args) {
if (called)
return;

called = true;
cancelTimer();
call(args);
}

@Override
public void call(Object... objects) {

}
}

关于java - 断开连接/错误时清除 socket.io 缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34537302/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com