Я использую один SocketChannel в 2 потоках, один поток для отправки данных и другой для получения данных.
SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress(ip,port));
socketChannel.configureBlocking(false);
Поток 1: использует вышеуказанный канал сокета для записи данных
Тема 2: использует тот же сокетканал для чтения данных
Я не использую никаких селекторов с socketchannel, так как мне нужно, чтобы запись и чтение были асинхронными (используя 2 разных потока)
ПРОБЛЕМА: при потере соединения операции socketchannel.write() и socketchannel.read() не вызывают никаких ошибок. Он просто блокирует операцию.
Мне нужно обнаружить потерю соединения.
Я попытался использовать метод сердцебиения в потоке 2, но поскольку операция чтения просто блокируется, этот метод не сработал. Есть ли другой способ обнаружить потерю соединения без использования сердцебиения в новом потоке?
Можно ли выдать ошибку при записи/чтении, если есть потеря соединения?
Заранее спасибо.
РЕДАКТИРОВАТЬ:
Тема 1:
public void run() {
socketChannel = SendAndReceivePacketUtil.createConnection(ip, port);
socketChannel.configureBlocking(false);
RecTask task = new RecTask(socketChannel);
Thread recThread = new Thread(task);
recThread.start();
while(true)
{
byte[] data= getDataFromQueue(ip);
if(data!= null) {
//print(new String(data));
sendPacket(data, socketChannel);
}
}
}
Тема 2: (RecTask)
public void run() {
while(true) {
byte[] data = receivePacket(socketChannel);
//print(new String(data));
}
}
Оба потока 1 и 2 имеют блоки try-catch-finally. окончательно закрывает socketchannel.
отправить пакет:
int dataSent = 0;
while (dataSent < data.length) {
long n = socketChannel.write(buf);
if (n < 0) {
throw new Exception();
}
dataSent += (int) n;
}
получить пакет:
int dataRec = 0;
byte[] data = new byte[length];
ByteBuffer buffer = ByteBuffer.wrap(data);
while (dataRec < length) {
long n = socketChannel.read(buffer);
if (n < 0) {
throw new Exception();
}
dataRec += (int) n;
}
return data;
Я постоянно отправляю и получаю данные. Но как только соединение теряется, ничего не печатается и код просто зависает. Это прямое приложение для Android Wi-Fi. Для сценария потери соединения я просто отключаю модуль Wi-Fi.