NIO DatagramSocket в Android. Не получаю ответа или 0

315
09 августа 2017, 18:29

Здравствуйте!
Разбираясь с этим вопросом, пришел к тому, что мне нужны неблокирующие сокеты.

Испробовал различные примеры - не удалось ничего из них запустить. Получаю либо ничего, либо 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();
        }
    }
}

Задача стоит следующая, надо сделать одним из способов взаимодействие с устройством по сети:

  1. Держать один поток в программе и в нем организовать очередь запросов. Постоянно крутить цикл в потоке, проверяя есть ли что послать и посылать. После посылок будет идти блок где мы считываем не пришло ли что либо.

  2. Можно сделать один поток который будет постоянно вертеть цикл и в нем прослушивать, не пришло ли что, а в отдельных потоках посылать запросы.

На блокирующих сокетах не удалось написать ни одного рабочего примера в одном потоке, только раздельно. В итоге получалась конкуренцая за сокет. На неблокирущих не удалось получить даже примитивного запрос/ответ( я выясняю в чем дело)

READ ALSO
Сохранение состояния View с помощью Icepick

Сохранение состояния View с помощью Icepick

Внедряю альбомную ориентацию в приложение и уже убил пару дней на поиск способа по сохранению состояния вьюшек

305
Как преобразовать строку во время?

Как преобразовать строку во время?

Есть строка вида : "09:00 10:07" (она хранится в файле)Мне нужно считать время

345
иконпаки в кастомном лаунчере [требует правки]

иконпаки в кастомном лаунчере [требует правки]

Здравствуйте!Делаю кастомный лаунчерНаписал уже почти все функции, но возможность использовать иконпаки еще не сделал, как это возможно...

254
elasticsearch Failed to execute [org.elasticsearch.action.search.SearchRequest@467f2861]

elasticsearch Failed to execute [org.elasticsearch.action.search.SearchRequest@467f2861]

Прошу помочь с данной ошибкой, с ES работать начал недавноВ логах завалило такими ошибками

382