Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > Java SocketServer + 300 клиентов = тормоза


Автор: chiffa 24.5.2017, 17:52
Всем привет. Столкнулся с проблемой: при большом количестве подключений >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();
                    
/*

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

*/


}

}
}




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

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


Автор: SVN74 24.5.2017, 20:08
невидно закрытия сокетов, а также не забывайте применять flush в буферах

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)