Простой Java-сервер с PrintWriter - проблема с отправкой ответа в браузер - PullRequest
0 голосов
/ 20 октября 2010

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

Сейчас я работаю на простом сервере, но я застрял на первом препятствии (ну, может быть, на втором или третьем), я не могу заставить его правильно ответить клиенту.

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

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

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

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

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

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

Infinitifizz

РЕДАКТИРОВАТЬ: Ой, забыл скопировать код в.

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");
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 20 октября 2010

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

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

0 голосов
/ 05 февраля 2011

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

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

...