2016-04-16 4 views
0

Я писал простой веб-сервер Java, чтобы помочь мне понять механизм. Но похоже, что это не сработает. он распечатает запрос, но я не могу получить ответ в браузере или в telnet-клиенте. Не могли бы вы помочь объяснить, почему ответа нет?простой веб-сервер Java, но нет вывода

public Server() throws IOException { 
    this.ss = new ServerSocket(this.PORT); 
} 

@Override 
public void run() { 

    while(true) { 
     try { 
      Socket cli = this.ss.accept(); 
      new Thread(new Hanlder(cli)).start(); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 

    } 
} 

class Hanlder implements Runnable { 

    private Socket client = null; 

    public Hanlder(Socket cli) { 
     client = cli; 
    } 

    @Override 
    public void run() { 
     BufferedWriter bwriter; 
     try { 

      InputStreamReader input = new InputStreamReader(this.client.getInputStream()); 
      BufferedReader buf = new BufferedReader(input); 
      String line = null; 
      while((line = buf.readLine()) != null) { 
       System.out.println(line); 
      } 

      bwriter = new BufferedWriter(new OutputStreamWriter(client.getOutputStream())); 
      bwriter.write("HTTP/1.1 200 OK \n" 
        + "Hello, World"); 
      bwriter.flush(); 

      this.client.close(); 

     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 

    } 
} 
+0

Какую ценность вы придавали для 'PORT'. и какой URL-адрес вы получаете? –

+0

PORT is 8888 URL http://127.0.0.1:8888/ – ludwigliu

ответ

1

Вы также должны предоставить Content-Type и Content-Length параметры в заголовках.

Также в HTTP вы должны заканчивать строки с \r\n и заканчивать заголовок \r\n\r\n.

.: например

bwriter.write("HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nContent-Length: 3\r\n\r\nABC"); 
+0

Спасибо. @Luke работает после того, как я прокомментировал цикл while ввода – ludwigliu

0
while((line = buf.readLine()) != null) { 

Этот цикл будет выходить, когда конец потока встречается.

Конец потока не встречается! Браузер только что прекратил отправку данных, пока он ждет ответа от сервера.

Пустая строка (я думаю), что сигнализирует о завершении HTTP-запроса. Таким образом, клиент HTTP/1.1 может отправлять дополнительные запросы (после получения первого ответа) на тот же сервер без накладных расходов на открытие нового соединения.

(Ваш сервер будет отправлять ответ, но только после того, как ваш клиент прервал соединение, которое, возможно, немного слишком поздно.)


EDIT Что вам нужно в цикле, пока (для стартеров):

if (line.isEmpty()) { 
    break; 
} 

Но весь HTTP-протокол действительно должен быть реализован. Это большой учебный проект, который вы предприняли. Наслаждайтесь!

+0

После того, как я прокомментировал эту часть и добавил символы «\ r \ n», она работает. Итак, входной поток заблокировал выходной поток? что мне делать, если я хочу распечатать запрос и ответ, а затем отправить ответ в браузер? – ludwigliu

+0

Удивительный! Это сработало. Благодарю. – ludwigliu

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