AsynchronousSocketChannel. Условие срабатывания Callback

214
31 мая 2018, 08:20

Есть такой код

AsynchronousSocketChannel channel;
.......
ByteBuffer buf = ByteBuffer.allocate(1000);
channel.read(buf, buf, CompletionHandler<Integer, ByteBuffer>() {
  @Override
  public void completed(Integer result, ByteBuffer attachment) {
    if (result != -1)
      System.out.println(attacment.hasRemaining());
  }
  @Override
  public void failed(Throwable exc, ByteBuffer attachment) {
     // process error
  }
});

и аналогичный для записи

ByteBuffer buf = ByteBuffer.allocate(1000);
..........
buf.rewind();
channel.write(buf, buf, CompletionHandler<Integer, ByteBuffer>() {
  @Override
  public void completed(Integer result, ByteBuffer attachment) {
    if (result != -1)
      System.out.println(attacment.hasRemaining());
  }
  @Override
  public void failed(Throwable exc, ByteBuffer attachment) {
     // process error
  }
});

Вопрос - всегда ли эти методы будут выводить false или возможна ситуация когда прочитано/записано байт меньше, чем в буфере и операцию нужно будет повторить?

Answer 1

В случае метода read вам может прийти данных больше, чем есть места в буфере buf. В этом случае будет выведено true и понадобится повторное чтение.

В случае метода write, если ваш сервер генерирует поток данных достаточный, чтобы забить буферы отправки, может возникнуть ситуация, когда вы не сможете записать в канал содержимое buf полностью. Тогда будет будет выведено true и понадобится повторная запись.

Лучше всего писать код с учётом возможности неполной отправки и приёма данных.

READ ALSO
Парсинг разных видов предложений

Парсинг разных видов предложений

Есть текст, в нем надо найти вопросительные, восклицательные и утвердительные предложенияПри это следует, каждое предложение добавить в коллекцию

174
Какой цикл будет быстрее

Какой цикл будет быстрее

Знаем, что forEach медленнее при работе с коллекциями, чем for (хотя может сейчас и это уже оптимизируется) Но накладывает ли приведение типов...

234
Как наполнять контентом android приложение? [закрыт]

Как наполнять контентом android приложение? [закрыт]

уважаемые разработчикиСтолкнулся с такой проблемой, точнее вопросом

163
org.sqlite.SQLiteException: [SQLITE_ERROR] SQL error or missing database (Connection is closed)

org.sqlite.SQLiteException: [SQLITE_ERROR] SQL error or missing database (Connection is closed)

Пытаюсь подключиться к БД Sqlite с помощью JDBC

386