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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Java SocketServer + 300 клиентов = тормоза 
:(
    Опции темы
chiffa
Дата 24.5.2017, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Всем привет. Столкнулся с проблемой: при большом количестве подключений >300 начинает подвисать соединенения на стороне клиента и по итого отваливает по таймауту. 
Алгоритм работы: Клиент подключился - отправил запрос на сервер о идентификации (вот здесь и виснет - ждет ответ) - сервер обработал запрос - записал в базу - отправил ответ.

На каждое подключение выделяется отдельный поток.

База не залипает и отвечает нормально.

Сервер создаю так:

Код

  ServerSocket serverSocket = null;
      Socket socket = null;
    
      

            try {
                serverSocket = new ServerSocket(PORT);
            } catch (IOException e) {
             PrintStackTraceLog.main("ServerSocket create:", e);
                e.printStackTrace();

            }
            while (true) {
                try {
                    socket = serverSocket.accept();
                    socket.setSoTimeout(240000);
                    
                  
                    
                } catch (IOException e) {
                    System.out.println("I/O error: " + e);
                }
                
                EchoThread handler = new EchoThread(socket);
                
                            handler.start();//As usual, this method calls run.

                
   
            }


и сам обработчик:


Код

public static class EchoThread extends Thread {
        protected Socket socket;
        private PrintWriter outSend= null;

        public EchoThread(Socket clientSocket) {
            this.socket = clientSocket;
        }

        public void run() {
            InputStream inp = null;
            BufferedReader brinp = null;

 inp = socket.getInputStream();
                
          
                    brinp = new BufferedReader(new InputStreamReader(inp, "Windows-1251")); 
         
                outSend = new PrintWriter(new OutputStreamWriter(
                     socket.getOutputStream(), StandardCharsets.UTF_8),true);


 String line;
            
          
            while (true) {
               
                    line = brinp.readLine();
                    
/*

Обрабатывается принятые запросы. Отправляются ответы клиенту

*/


}

}
}




Может кто подскажет, в чем может быть проблема? Куда копать? Как тестить?....

Заранее благодарен за помощь!


PM MAIL   Вверх
SVN74
Дата 24.5.2017, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 5.5.2008
Где: Комсомольск на Дн епре

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



невидно закрытия сокетов, а также не забывайте применять flush в буферах
PM MAIL WWW   Вверх
LSD
Дата 24.5.2017, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15709
Регистрация: 24.3.2004

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



1. Помимо непосредственного закрытия сокетов, не стоит забывать что сокет еще остается какое-то время открытым. Тут можно попробовать поставить SO_LINGER в 0 если соединение идет по локалке.
2. 300 потоков это довольно много, тормозить может и на этом тоже. Если 300 соединений это нормальная ситуация, то стоит перейти на неблокирующий IO, например Netty.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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