2010-10-20 4 views
0

Я только что начал искать HTTP и т. Д. И написал простой Java-клиент, который использует URLConnection для отправки URL-адреса на сервер и вытягивает страницу index.html (как обычный текст).Простой Java-сервер с PrintWriter - проблема с ответом на браузер

Теперь я работаю на простом сервере, но я застрял в первом препятствии (возможно, 2-й или 3-й), я не могу заставить его нормально реагировать на клиента.

Вот чтение в цикле, и он читает в запросе HTTP штрафа, даже от FF и IE и т.д.:

while((message = in.readLine()) != null) 
    { 
     System.out.println(message); 
     out.write("something"); 
    } 

Проблема заключается в том, что я не знаю, как получить его, чтобы ответить что-нибудь полезное , Если я позволяю ему делать то, что он делает в приведенном выше коде, он отправляет «что-то» 6 раз моему клиенту (так как есть 6 строк для HTTP-запроса), но ничего для FF/IE и т. Д.

Кроме того, Кажется, что он прерывает цикл, когда я добавил строку System.out.println("test"); для печати после цикла, но сервер, похоже, не достиг этой точки, не так ли? Должно ли readLine() возвращать null в конце первого HTTP-запроса?

Я читал материал на веб-сайтах sun и oracle, но я все еще довольно зациклен на том, как это должно работать.

Спасибо за ваше время,

Infinitifizz

EDIT: Ой, забыл скопировать код в

Server.java:.

package exercise2; 

import java.net.*; 

public class Server 
{ 
    public static void main(String[] args) throws Exception 
    { 
     boolean listening = true; 
     ServerSocket server = new ServerSocket(8081); 

    while(listening) 
    { 
     Socket client = server.accept(); 

     new ServerThread(client).start(); 
    } 
     server.close(); 
    } 
} 

ServerThread.java:

package exercise2; 

import java.io.*; 
import java.net.*; 

    public class ServerThread extends Thread 
{ 
    private Socket socket = null; 
    public ServerThread(Socket s) 
    { 
     this.socket = s; 
    } 

    public void run() 
    { 
     try 
     { 

     PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 
     BufferedReader in = new BufferedReader(new InputStreamReader(
            socket.getInputStream())); 

     String message, reply = ""; 

     while((message = in.readLine()) != null) 
     { 
      System.out.println(message); 
      out.write("something"); 
     } 
      System.out.println("test"); 
     in.close(); 
     out.close(); 
     socket.close(); 
     } 
     catch(IOException e) 
     { 
      System.err.println("error"); 
     } 
    } 
} 

ответ

0

Прежде всего, изменить состояние в то время цикла для
while(in.hasNextLine()) {
    message = in.nextLine();
    //etc....

Во-вторых, вам не нужно, чтобы выйти из цикла в то время как во время работы сервера. Вы должны выполнить весь синтаксический анализ запросов внутри цикла while, используя инструкции if для различения запросов. Единственный раз, когда вы когда-либо выходите из цикла while, - это когда соединение должно закрыться, иначе метод nextLine() будет блокироваться, пока что-то не будет получено.

+0

Жаль, что это было давно. Я, наконец, получил эту работу, как сказал Рой. Вскоре после того, как этот вопрос стал спорным, потому что я пошел по пути приема запросов как байтов, а не строк, чтобы я мог управлять данными изображения и т. Д. –

2

Не видя код клиента, это мое лучшее предположение о том, что происходит:

Ваш сервер, вероятно, блокирует это readLine(), потому что клиент выполнил запись запроса, но не закрыл соединение (так как он должен: клиент должен подождать, чтобы получить ответ по тому же соединению). Как правило, HTTP-сервер анализирует запрос по мере его чтения: на основе this вы можете искать «\ r \ n \ r \ n» для разграничения конца заголовка и вырывания из вашего цикла чтения в этот момент проанализируйте запрос и ответьте на него.

+0

Также рекомендуется закрыть потоки в блоке finally. В примере с кодом сервера ServerThread вы закрываете потоки запросов/ответов внутри одного блока try, их следует перенести в блок finally. Это обеспечило бы, что если вызов in.readLine() или out.write() завершился неудачей, ваши базовые стромы все равно будут закрыты и позволят освободить соединение.Это относится и к вашему клиенту - и вполне может быть источником вашей проблемы. – mmccomb

+0

Спасибо за ответы Seth и mmccomb, но у меня все еще есть проблема с бесконечным циклом. Я изменил его так, чтобы цикл while теперь имел: if (message.equals ("\ r \ n \ r \ n")) {break;}, но он все еще не выходит из цикла. Я также теперь использую IE, FF и Chrome вместо своего собственного клиента, чтобы свести к минимуму вероятность ошибок с моей стороны. Любые идеи, что делать? следует ли искать «\ r \ n \ r \ n» или что-то еще? Правильно ли синтаксис equals()? Спасибо –

+0

Итак, теперь я изменил оператор if, чтобы он читал: if (message.endsWith ("\ r \ n")) {break;}, но это все еще не работает, я просто использую неправильную комбинацию CRLF ? Где я могу найти, сколько должно быть? Еще раз спасибо. –

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