![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Anton Vatchenko |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 21.5.2004 Репутация: нет Всего: -1 |
Вроде я всегда считал, что write не создает никаких задержек, но когда количество пользователей моей системы возрасло, обращения к каждому write стали занимать по 5-10 секунд... Это так, или я в чем-то неправ? Существуют ли какие-то особенности?
|
|||
|
||||
| Anton Vatchenko |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 21.5.2004 Репутация: нет Всего: -1 |
С сокетами сейчас никто не работает?
|
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: нет Всего: 72 |
Нужно использовать package java.nio. В SDK есть пример по использованию
|
|||
|
||||
| Anton Vatchenko |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 21.5.2004 Репутация: нет Всего: -1 |
А что это дает? Вроде это обычные буфера... А мне нужен неблокирующийся сокет...
|
|||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 11 Всего: 43 |
запись в поток по сути своей неблокирующая операция - пишет, пока есть что писать и пока есть место в буфере, т.е. память. Наверное, когда много клиентов, памяти не хватает, включается gc, а может и OutOfMemory выскочить.
В nio несколько по-другому. Там пишется не в безразмерный поток, а в ByteBuffer фиксированного размера. Если клиенты не успевают опустошать свои буфера, то и запись туда замедляется. Нельзя записать в буфер, если там нет свободного места. Но это контролируется программистом. Писать в поток, это как добавлять элементы в ArrayList. Писать в ByteBuffer - это добавлять байты в byte[]. Это сообщение отредактировал(а) COVD - 16.5.2007, 17:48 |
|||
|
||||
| Anton Vatchenko |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 21.5.2004 Репутация: нет Всего: -1 |
А как сделать, чтобы памяти всегда хватало... Вот я хочу загнать скажем 2 мегабайта, а я так понял буфера не хватает...
|
|||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 11 Всего: 43 |
сначала убедитесь, что дело в памяти. Например, активируйте лог gc ( в командной строке запуска приложения добавьте параметр -Xloggc: ). Увидите в консоле как часто он срабатывает и сколько памяти занимает приложение.
|
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: нет Всего: 72 |
Дело не только в размере буфера. Если у клиента стоит firewall и он открывает страницу с апплетом, который начинает общаться с сервером по нестандартному порту, firewall спросит, разрешить ли этот обмен. Пока клиент не ответит да или нет, нить сервера, вызвавшая write(), будет заблокирована, если сокет откыт в блокирующем режиме. nio позволяет открыть сокет в неблокирующем режиме (но сам я не пробовал).
|
|||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 11 Всего: 43 |
Я полагал, что клиент дает "добро" файрволу на соединение, а не на обмен. Пока не разрешит, accept() на сервере не произойдет. Впрочем, файрволы бывают разные. Если клиент пытается соединиться из офиса, в котором установлен корпоративный файрвол, то, бывает, клиенту просто отказывают в соединении и никаких вопросов не задают. |
|||
|
||||
![]()
|
| Правила форума "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. |