2016-10-09 1 views
-1

Я пытаюсь написать свой HttpServer в JAVA.Производительность на сетях codding

Существует простой код для создания сокетов (сервер и клиент), а также чтение и сбор информации заголовка, как только пользователь пишет URL-адрес.

Я ищу хороший способ (код производительности), который может манипулировать получением/сбором данных.

В моем коде, который я написал, я заполняю, что это кажется плохим.
Может быть, кто может помочь мне объяснить о третьем уровне, попробуйте блок для написания хорошего кода?

Например, я думаю, что if (headerTempData.contains("\r\n\r\n")) break; будет медленным для потоковой передачи и сбора данных из подключенного сокета, потому что я не знаю, сколько строк заголовков будет загружено, и для всей проверенной информации.

Может быть, кто знает дополнительную точку соответствующей литературы (книги, то есть), которые могут помочь мне понять, для хорошей производительности коды для HTTP протоколов очень помогает мне

Спасибо!

специальный код попытка блока:

try (InputStream raw = socket.getInputStream()) { 

    String headerTempData = ""; 

    // chain the InputStream to a Reader 
    Reader reader = new InputStreamReader(raw); 

    int c; 
    while ((c = reader.read()) != -1) { 
     headerTempData += (char) c; 
     System.out.print((char) c); 

     if (headerTempData.contains("\r\n\r\n")) 
      break; 
    } 

    System.out.println("- - - - - - - - - - - - EOL - - - - - - - - - - - -"); 

} 

Весь код Пример:

package pk7HttpServer; 

import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.Reader; 
import java.net.MalformedURLException; 
import java.net.ServerSocket; 
import java.net.Socket; 

/** 
* Created by Morris on 08/10/16. 
*/ 
public class HTTPServer { 


    public static void main(String[] args) { 

     new HTTPServer().startServer(); 
    } 

    public void startServer() { 

     try (ServerSocket serverSocket = new ServerSocket(8080)) { 

      System.out.println("Server is started"); 

      while (true) { 
       Socket socket = serverSocket.accept(); 

       try { 
        try (InputStream raw = socket.getInputStream()) { 

         String headerTempData = ""; 

         // chain the InputStream to a Reader 
         Reader reader = new InputStreamReader(raw); 

         int c; 
         while ((c = reader.read()) != -1) { 
          headerTempData += (char) c; 
          System.out.print((char) c); 

          if (headerTempData.contains("\r\n\r\n")) 
           break; 
         } 

         System.out.println("- - - - - - - - - - - - EOL - - - - - - - - - - - -"); 

        } 
       } catch (MalformedURLException ex) { 
        System.err.println(socket.getLocalAddress() + " is not a parseable URL"); 

       } catch (IOException ex) { 
        System.err.println(ex.getMessage()); 
       } 
      } 

     } catch (Exception ex) { 
      System.out.println("error# " + ex.getMessage()); 
     } 
    } 
} 
+2

Вы проверили его еще? Что заставляет вас думать, что ваш путь неэффективен? Это звучит как преждевременная оптимизация, которая является кандидатом на трату времени. Сосредоточьтесь на оптимизации, когда вы точно знаете, что есть проблема с эффективностью. –

+1

Это для класса или для решения реальной проблемы? – chrylis

+0

Сервер обычно должен обслуживать множество клиентов. Поэтому вы должны передать сокет, который вы получаете от serverSocket.accept(), в собственный поток, который обслуживает этот один запрос. Основной треск возвращается к accept() для готовности к следующему запросу другого клиента. – Heri

ответ

1

Ваш синтаксический анализ логики имеет несколько недостатков.

  1. Отправитель может передавать данные кусками. Это означает, что read() возвращает -1, хотя весь вход еще не получен. Вы должны реализовать логику для повторного ввода read(), если ожидаемый конец данных еще не достигнут.
  2. Преобразование каждого байта в символ (вы не указали используемый набор символов, поэтому ваш код ведет себя по-разному на окнах и машинах linux) является операцией тайм-потребления. Таким образом, вы вызываете contains() (что является еще одной временной операцией) на каждый полученный вами байт.
  3. Я предлагаю читать входящие данные в блоках (например, 1024 байта), агрегировать их и только если вы считаете, что в настоящее время получено достаточно данных, чтобы преобразовать байтовый массив в строку, используя определенный набор символов.
  4. \ r \ n - это разрыв строки на окнах. На других платформах это другое.
  5. До тех пор, пока полученные данные меньше длины вашего вызова -содержания, это никогда не может быть правдой. Проверьте, нет ли заголовка, только если у вас достаточно данных.
+0

Я знал, что что-то плохое в моем коде. Спасибо за подробный ответ. – morris

 Смежные вопросы

  • Нет связанных вопросов^_^