Simple Java Server с PrintWriter - Проблема Отправка ответа на браузер

StackOverflow https://stackoverflow.com/questions/3979993

Вопрос

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

Теперь я работаю на простом сервере, но я застрял на первом препятствию, (ну может быть, 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 () Вернуть нуль в конце первого http-запроса?

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

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

Infinitifizzizz

Редактировать: упс, забыл скопировать код в.

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");
        }
    }
}
Это было полезно?

Решение

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top