![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Platon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1801 Регистрация: 25.4.2006 Репутация: 3 Всего: 40 |
Здравствуйте, уважаемые.
В поисках хорошего многопоточного сервера наткнулся на реализацию от IBM Несмотря на то, что с nio лично не знаком, но идея приведенная в NioServer довольно ясна, единственное, вопросы вызывает метод:
((SocketChannel)key.channel()).read(byteBuffer) посмотрел я на read, подумал, он будет ждать с другой стороны завершения, ан нет! в доке написано что читает столько, сколько есть на тот момент, когда вызван метод. И выходит, что данные вроде как до конца не дошли, а уже собираемся писать ответ. Или это такая задумка разработчиков, тогда прошу разъяснить в чем ее прелесть, или я просто неправильно о ней думаю, тогда как правильно думать? Это сообщение отредактировал(а) Platon - 12.8.2007, 17:02 |
|||
|
||||
| AlexeyVorotnikov |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 658 Регистрация: 18.6.2007 Где: Москва Репутация: 1 Всего: 18 |
Ну из приведённого фрагмента трудно понять задумку разработчиков. Из этого фрагмента видно только, что данные читаются из сокета и сохраняются в некоем объекте класса Client. Вопрос в том, что это за класс...
-------------------- RTFM! Три источника и три составные части Java: The Java Language Specification, Java Platform API Specification, The Java Virtual Machine Specification |
|||
|
||||
| Platon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1801 Регистрация: 25.4.2006 Репутация: 3 Всего: 40 |
Я дал ссылку на небольшое описание + там же архив с исходным кодом.
Это сообщение отредактировал(а) Platon - 12.8.2007, 20:22 Присоединённый файл ( Кол-во скачиваний: 7 )
j_nioserver_source.zip 26,10 Kb |
|||
|
||||
| AlexeyVorotnikov |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 11 Всего: 43 |
входной параметр метода readDataFromSocket - обьект key. Этот key получен обычно в результате операции select и является готовым к чтению, т.е. в канал пришли какие-то байты, хотя бы один, т.е. канал не пустой. Эти байты мы считываем в буфер и их количество равно count ( если же получен EOF, т.е. противоположная сторона закрыла соединение, то count = -1 и мы тоже должны закрыться). Прочитанные байты копируются в data и отправляются потребителю в метод write. Все, больше тут ничего нет. Вас не должно смущать, что данные из сети поступают порциями (и соответственно читаются из канала порциями) и минимальные размер порции гипотетически может быть 1 байт. |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Работа с сетью | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |