Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Пара вопросов по java.nio 
:(
    Опции темы
untied
Дата 13.7.2010, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 13.7.2010

Репутация: нет
Всего: нет



Приветствую.

Сразу скажу, что туториалы и примеры по java.nio (в т.ч. The Rox Java NIO) я читал. Интересует следующее:

1. Во всех туториалах предполагается, что размер принимаемого сервером пакета заведомо меньше размера буфера. Соответственно разик прочитали в буфер, получили пакет. А что делать, если размер пакета может быть больше размера буфера? Допустим, кто-то шлет файло на несколько мегабайт. Как это склеивать?

2. Как отслеживать таймаут? Допустим, прочитали в буфер, отослали этот буфер в поток-склеиватель пакетов. Как прекратить сборку пакета, если превышено время ожидания?
PM MAIL   Вверх
Kircul
Дата 13.7.2010, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 20.2.2007

Репутация: нет
Всего: 7



Можно сразу пример кода, который не понравился?
PM   Вверх
untied
Дата 13.7.2010, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 13.7.2010

Репутация: нет
Всего: нет



Ну почему не понравился? Мне все нравится. Просто найденные примеры не годятся для моей задачи.

__h t t p : / / rox-xmlrpc.sourceforge.net/niotut/
__h t t p : / / habrahabr.ru/blogs/java/70690/

В обоих примерах предполагается, что размер входящего пакета меньше размера буфера. Соответственно, одно чтение -- один пакет, таймаут не нужен.

У меня размер входного пакета может быть несколько мегабайт (до сотни). Делать буфер такого размера нерентабельно (да Java и не даст). Соответственно, пакет нужно собирать по кускам. Но как?
PM MAIL   Вверх
Kircul
Дата 13.7.2010, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 20.2.2007

Репутация: нет
Всего: 7



Исходя из кода тут, метод read нужно модифицировать примерно так:
Код

         private void read(SelectionKey key) throws IOException {
        SocketChannel socketChannel = (SocketChannel) key.channel();

        // Clear out our read buffer so it's ready for new data
        this.readBuffer.clear();

        // Attempt to read off the channel
        int numRead;
        try {
                        while ((numRead = socketChannel.read(this.readBuffer)) != -1) {
                              // Handle the response
                      this.handleResponse(socketChannel, this.readBuffer.array(), numRead);                
                }
                        // Remote entity shut the socket down cleanly. Do the
            // same from our end and cancel the channel.
            key.channel().close();
            key.cancel();
            return;
        } catch (IOException e) {
            // The remote forcibly closed the connection, cancel
            // the selection key and close the channel.
            key.cancel();
            socketChannel.close();
            return;
        }
        
    }

Как-то так оно должно принять полный пакет.
PM   Вверх
COVD
Дата 13.7.2010, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 11
Всего: 43



Цитата

предполагается, что размер принимаемого сервером пакета заведомо меньше 


Вовсе нет. Данные из сети  поступают любыми порциями, но в буфер за один раз будет прочитано не больше, чем там (в буфере) есть свободного места.  

http://download.oracle.com/docs/cd/E17476_...nio.ByteBuffer)
Цитата

public abstract int read(ByteBuffer dst)
...
An attempt is made to read up to r bytes from the channel, where r is the number of bytes remaining in the buffer


Вообще, если мало (сотни) клиентов обмениваются с сервером большими обьемами данних, то возможно проще и эффективнее использовать IO (один клиент - один блокируюший поток). NIO (много клиентов - один неблокируюший поток) выгоден, когда много (тысячи) клиентов эпизодически (т.е. со значительными паузами) обмениваются мелкими порциями данных.


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.1217 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.