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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> В Socket OutputStream.write блокирующая? 
:(
    Опции темы
Anton Vatchenko
Дата 16.5.2007, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вроде я всегда считал, что write не создает никаких задержек, но когда количество пользователей моей системы возрасло, обращения к каждому write стали занимать по 5-10 секунд... Это так, или я в чем-то неправ? Существуют ли какие-то особенности?


--------------------
user posted image
PM MAIL   Вверх
Anton Vatchenko
Дата 16.5.2007, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



С сокетами сейчас никто не работает?


--------------------
user posted image
PM MAIL   Вверх
math64
Дата 16.5.2007, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Нужно использовать package java.nio. В SDK есть пример по использованию
PM   Вверх
Anton Vatchenko
Дата 16.5.2007, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А что это дает? Вроде это обычные буфера... А мне нужен неблокирующийся сокет...


--------------------
user posted image
PM MAIL   Вверх
COVD
Дата 16.5.2007, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



запись в поток по сути своей неблокирующая операция - пишет, пока есть что писать и пока есть место в буфере, т.е. память. Наверное, когда много клиентов, памяти не хватает, включается gc, а может и OutOfMemory выскочить.

В nio несколько по-другому. Там пишется не в безразмерный поток, а в ByteBuffer фиксированного размера. Если клиенты не успевают опустошать свои буфера, то и запись туда замедляется. Нельзя записать в буфер, если там нет свободного места. Но это контролируется программистом.

Писать в поток, это как добавлять элементы в ArrayList. Писать в ByteBuffer - это добавлять байты в byte[]. 

Это сообщение отредактировал(а) COVD - 16.5.2007, 17:48
PM MAIL   Вверх
Anton Vatchenko
Дата 16.5.2007, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


--------------------
user posted image
PM MAIL   Вверх
COVD
Дата 16.5.2007, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



сначала убедитесь, что дело в памяти. Например, активируйте лог gc ( в командной строке запуска приложения добавьте параметр -Xloggc: ). Увидите в консоле как часто он срабатывает и сколько памяти занимает приложение.
PM MAIL   Вверх
math64
Дата 17.5.2007, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Дело не только в размере буфера. Если у клиента стоит firewall и он открывает страницу с апплетом, который начинает общаться с сервером по нестандартному порту, firewall спросит, разрешить ли этот обмен. Пока клиент не ответит да или нет, нить сервера, вызвавшая write(), будет заблокирована, если сокет откыт в блокирующем режиме. nio позволяет открыть сокет в неблокирующем режиме (но сам я не пробовал).

PM   Вверх
COVD
Дата 17.5.2007, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

Дело не только в размере буфера. Если у клиента стоит firewall и он открывает страницу с апплетом, который начинает общаться с сервером по нестандартному порту, firewall спросит, разрешить ли этот обмен. Пока клиент не ответит да или нет, нить сервера, вызвавшая write(), будет заблокирована, если сокет откыт в блокирующем режиме. nio позволяет открыть сокет в неблокирующем режиме (но сам я не пробовал).


Я полагал, что клиент дает "добро" файрволу на соединение, а не на обмен. Пока не разрешит, accept() на сервере не произойдет. Впрочем, файрволы бывают разные. Если клиент пытается соединиться из офиса, в котором установлен корпоративный файрвол, то, бывает, клиенту просто отказывают в соединении и никаких вопросов не задают.  

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

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

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


 




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


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

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