0

私は実際にこの問題を約1時間解決しようとしていますが、解決策を見つけることができません.

以下のコードを見てください。

public void handleRequest() throws IOException {
    while(in.hasNextLine()) {
        System.out.println(in.nextLine());
    }

    out.print("HTTP/1.0 200 OK\r\n\r\ntest");
    out.flush();
}

ブラウザ (Chrome) をlocalhostに接続すると、永遠にハングアップします。リクエストから派生したすべての入力行を実際に受け取るには、エスケープを押す必要があります(強制的にリクエストを停止します)。

アイデアは非常に単純です。リクエストに次の行がある場合は、何もなくなるまでその行を取得してから、200 OK 応答を送信します。しかし、これはまったく機能しません。

編集:

@Zutty は in がどこにあるのか尋ねました:

public class HttpServer {
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 FileInputStream fstream;
private final String TWOHUNDRED = "HTTP/1.0 200 OK\r\n"
                                + "Content-Type: text/html\r\n"
                                + "\r\n";

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 class Main {
    public static void main(String[] args) throws IOException {
        HttpServer server = new HttpServer();

        while(true) {
            try(Socket client = server.accept()) {
                server.handleRequest();
            }
        }
    }
}
4

1 に答える 1

1

HTTP を使用している場合は、常にContent-Length ヘッダーを送信する必要があります。次に、受信側は、読み取るコンテンツの正確なバイト数を認識します。これにより、面倒な「EOF まで読み取る」または「\r\n\r\n が見つかるまで」の問題がすべて回避されます。

于 2013-03-07T18:27:34.453 に答える