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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> j-nioserver, непонятно как рабоает метод 
V
    Опции темы
Platon
Дата 12.8.2007, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Здравствуйте, уважаемые.

В поисках хорошего многопоточного сервера наткнулся на реализацию от IBM

Несмотря на то, что с nio лично не знаком, но идея приведенная в NioServer довольно ясна, единственное, вопросы вызывает метод:

Код

public void readDataFromSocket(SelectionKey key) throws IOException {
        int count = ((SocketChannel)key.channel()).read(byteBuffer);
        if ( count > 0) {
            byteBuffer.flip();
            byte[] data = new byte[count];
            byteBuffer.get(data, 0, count);
            ((Client)key.attachment()).write(data);
        } else if ( count < 0) {
            key.channel().close();
        }
        byteBuffer.clear();
    }


((SocketChannel)key.channel()).read(byteBuffer)
посмотрел я на read, подумал, он будет ждать с другой стороны завершения, ан нет! в доке написано что читает столько, сколько есть на тот момент, когда вызван метод.

И выходит, что данные вроде как до конца не дошли, а уже собираемся писать ответ.
Или это такая задумка разработчиков, тогда прошу разъяснить в чем ее прелесть, или я просто неправильно о ней думаю, тогда как правильно думать?

Это сообщение отредактировал(а) Platon - 12.8.2007, 17:02
PM MAIL ICQ   Вверх
AlexeyVorotnikov
Дата 12.8.2007, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 658
Регистрация: 18.6.2007
Где: Москва

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



Ну из приведённого фрагмента трудно понять задумку разработчиков. Из этого фрагмента видно только, что данные читаются из сокета и сохраняются в некоем объекте класса Client. Вопрос в том, что это за класс...


--------------------
RTFM!
Три источника и три составные части Java: The Java Language Specification, Java Platform API Specification, The Java Virtual Machine Specification
PM MAIL   Вверх
Platon
Дата 12.8.2007, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Я дал ссылку на небольшое описание + там же архив с исходным кодом.

Это сообщение отредактировал(а) Platon - 12.8.2007, 20:22

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  j_nioserver_source.zip 26,10 Kb
PM MAIL ICQ   Вверх
AlexeyVorotnikov
Дата 12.8.2007, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 658
Регистрация: 18.6.2007
Где: Москва

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



Класс Client в данном случае служит просто передаточным звеном, своего рода буфером, между сокетом и потребителем информации. В методе ServerEventHandler.readDataFromSocket данные читаются из сокета и запихиваются в этот самый Client. Потом эти данные из него читает класс HttpRequest. На сколько я понял, вся фишка этой реализации многопоточного сервера именно в том, что данные читаются кусочками по мере поступления первым попавшимся свободным потоком.


--------------------
RTFM!
Три источника и три составные части Java: The Java Language Specification, Java Platform API Specification, The Java Virtual Machine Specification
PM MAIL   Вверх
COVD
Дата 13.8.2007, 06:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

как правильно думать?



входной параметр метода readDataFromSocket -  обьект key. Этот key получен обычно в результате операции select и является готовым к чтению, т.е. в канал пришли какие-то байты, хотя бы один, т.е. канал не пустой. Эти байты мы считываем в буфер и их количество равно count ( если же получен EOF, т.е. противоположная сторона закрыла соединение, то count = -1 и мы тоже должны закрыться).  Прочитанные байты копируются в data и отправляются потребителю в метод write. Все, больше тут ничего нет.

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



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

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

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


 




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


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

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