2

そのため、クラスで ServerSockets をいじって、リクエストを受け取って何もせず、200 OK に続いて HTML コンテンツで応答する非常に単純な HTTP サーバーを作成します。

私はこの問題を 2 日間解こうとしてきましたが、理解できませんでした。先生も理解できませんでした。奇妙な理由で、サーバーを閉じることに問題があると思うようになりました。私は問題を解決しましたが、そもそもなぜ私が起こったのか知りたいのです.

以下に 3 つのスニペットを示します。

HttpServer.class:

package httpserver;

import java.io.Closeable;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class HttpServer implements Closeable {
    public static final int PORT = 80;
    public static final int BACKLOG = 1;
    public static final String ROOT_CATALOG = "C:/HttpServer/";

    private ServerSocket server;
    private Socket client;
    private Scanner in;
    private PrintWriter out;

    private String request;

    public HttpServer() throws IOException {
        server = new ServerSocket(PORT, BACKLOG);
    }

    public Socket accept() throws IOException {
        client = server.accept();
        in = new Scanner(client.getInputStream());
        out = new PrintWriter(client.getOutputStream());

        return client;
    }

    public void recieve() {
        request = in.nextLine();
        System.out.println(request);
    }

    public void respond(final String message) {
        out.print(message);
        out.flush();
    }

    @Override
    public void close() throws IOException {
        if(!server.isClosed()) {
            client = null;
            server = null;
        }
    }
}

動作するMain.class ソリューション:

package httpserver;

import java.io.IOException;
import java.net.Socket;

public class Main {
    public static void main(String[] args) throws IOException {
        HttpServer server = new HttpServer();
        Socket client;

        while(true) {
            client = server.accept();
            server.recieve();
            server.respond("HTTP/1.0 200 OK\r\n"
                    + "Content-Type: text/html\r\n"
                    + "\r\n"
                    + "<html><body><b>hello..</b></body></html>");
            client.close();
        }
    }
}

動作しないMain.class ソリューション:

package httpserver;

import java.io.IOException;

public class Main {
    public static void main(String[] args) {
        try(HttpServer server = new HttpServer()) {
            while (true) {
                server.accept();
                server.recieve();
                server.respond("HTTP/1.0 200 OK\r\n"
                        + "Content-Type: text/html\r\n"
                        + "\r\n"
                        + "<html><body><b>hello..</b></body></html>");
            }
        } catch(IOException ex) {
            System.out.println("We have a problem: " + ex.getMessage());
        }
    }
}

各ループの反復後にクライアントソケットを閉じないことに関係があると想像できます。それでも、その場合にバグが発生する前に、少なくとも一度は通過する必要があります。問題が何であるかが本当にわかりません。

エラーメッセージも何もありません...

4

1 に答える 1

1

HTTP を送信するときにContent-lengthを指定しないため、ブラウザーはデータの読み取りを停止するタイミングを認識できません。詳細については、HTTP サーバーがいつデータの送信を完了したかを知る方法を参照してください。

実際の例では、クライアントソケットを閉じました。これにより、ブラウザーにデータがなくなったことを伝えます。ブラウザーに応答させたくない場合は、これで十分かもしれません。

于 2013-03-06T14:58:08.747 に答える