Здравствуйте!
Разбираясь с этим вопросом, пришел к тому, что мне нужны неблокирующие сокеты.
Испробовал различные примеры - не удалось ничего из них запустить. Получаю либо ничего, либо 0.
В соответствии с тем, что я хочу сделать из предыдущего вопроса у меня появилось два варианта:
Чтобы не быть голословным создал репозиторий на гитхабе, где выложил все мои попытки.
Ключевой участок кода в примере с nio(не работает):
import android.os.Handler;
import android.os.Message;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.DatagramChannel;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
/**
* Created by ivan on 07/08/17.
*/
public class CatchThread extends Thread {
byte[] data;
DatagramChannel channel;
int port = 1025;
String address = "10.22.13.198";
Handler handeler;
public void setHandeler(Handler handeler) {
this.handeler = handeler;
}
public CatchThread(byte[] array/*, DatagramChannel channel*/) throws IOException {
data = array;
}
@Override
public void run() {
super.run();
try {
this.channel = DatagramChannel.open();
this.channel.socket().bind(new InetSocketAddress(1025));
this.channel.configureBlocking(false);
/* Selector selector = Selector.open();
this.channel.register(selector, SelectionKey.OP_READ);
this.channel.register(selector, SelectionKey.OP_WRITE);
this.channel.register(selector, SelectionKey.OP_CONNECT);*/
this.channel.connect(new InetSocketAddress("10.22.13.198", 1025));
} catch (IOException e) {
e.printStackTrace();
handeler.sendMessage(Message.obtain(handeler,0,"bug: "+e));
}
//Send
ByteBuffer buf = ByteBuffer.allocate(data.length);
buf.clear();
buf.put(data);
buf.flip();
try {
int bytesSent = channel.send(buf,
new InetSocketAddress("10.22.13.198", port));
} catch (IOException e) {
e.printStackTrace();
handeler.sendMessage(Message.obtain(handeler,0,"3"));
}
buf.clear();
handeler.sendMessage(Message.obtain(handeler,0,"5"));
ByteBuffer bufReceive = ByteBuffer.allocate(100);
while (channel.isOpen()) {
try {
int result = channel.read(bufReceive);//receive();
handeler.sendMessage(Message.obtain(handeler,0,"result: "+result));
bufReceive.flip();
while ( bufReceive.hasRemaining()) {
handeler.sendMessage(Message.obtain(handeler,0,"Result: "+bufReceive.get()));
}
bufReceive.clear();
} catch (IOException e) {
e.printStackTrace();
}
}
handeler.sendMessage(Message.obtain(handeler,0,"2"));
try {
this.channel.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Задача стоит следующая, надо сделать одним из способов взаимодействие с устройством по сети:
Держать один поток в программе и в нем организовать очередь запросов. Постоянно крутить цикл в потоке, проверяя есть ли что послать и посылать. После посылок будет идти блок где мы считываем не пришло ли что либо.
Можно сделать один поток который будет постоянно вертеть цикл и в нем прослушивать, не пришло ли что, а в отдельных потоках посылать запросы.
На блокирующих сокетах не удалось написать ни одного рабочего примера в одном потоке, только раздельно. В итоге получалась конкуренцая за сокет. На неблокирущих не удалось получить даже примитивного запрос/ответ( я выясняю в чем дело)
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Внедряю альбомную ориентацию в приложение и уже убил пару дней на поиск способа по сохранению состояния вьюшек
Есть строка вида : "09:00 10:07" (она хранится в файле)Мне нужно считать время
Здравствуйте!Делаю кастомный лаунчерНаписал уже почти все функции, но возможность использовать иконпаки еще не сделал, как это возможно...
Прошу помочь с данной ошибкой, с ES работать начал недавноВ логах завалило такими ошибками