为什么我的HTTP响应没有显示在浏览器中?

时间:2014-11-30 17:07:54

标签: java http

我正在尝试用Java编写HTTP服务器。在通过示例并添加一些用于调试的内容之后,这就是我到目前为止所做的:

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

public class AddyServer {
    public static void main(String[] args) {

    int portNumber = Integer.parseInt(args[0]);
    try{
        System.err.println("Trying...");
        ServerSocket serverSocket = new ServerSocket(portNumber);
        System.err.println("Waiting...");
        //PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
            while(true) {
                System.err.println("Waiting...");
                Socket clientSocket = serverSocket.accept();

                System.err.println("accepted");

                BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                PrintWriter out = new PrintWriter(clientSocket.getOutputStream());



                String line;
                while((line=in.readLine())!=null) {
                        if(line.isEmpty())
                            break;
                        out.print(line+"\r\n");
                        System.out.print(line+"\r\n");
                }

                out.print("HTTP/1.1 200\r\n"); //EDITED
                out.print("Content-Type: text/html\r\n");
                out.print("Connection: close\r\n");
                out.print("\r\n");
                out.print("<!doctype html>\n");
                out.print("<title>Test title</title>\n");
                out.print("<p>Test</p>\n");

                System.out.print("HTTP/1.1 200 \r\n");
                System.out.print("Content-Type: text/html\r\n");
                System.out.print("Connection: close\r\n");
                System.out.print("\r\n");
                System.out.print("<!doctype html>\n");
                System.out.print("<title>Test title</title>\n");
                System.out.print("<p>Test</p>\n");

                in.close();
                out.close();
                clientSocket.close();
            }
        } catch (IOException e) {System.err.println(e);} //EDITED
    }
}

我不明白为什么当我尝试连接到我的服务器时,我的互联网浏览器没有在浏览器中显示HTTP响应主体。

2 个答案:

答案 0 :(得分:1)

写入socket后添加刷新(通过PrintWriter)。你还需要在某个时候关闭serverSocket,否则,你只会在端口被绑定的情况下测试它时遇到问题。

编辑这会准确显示您要刷新的位置。经过测试,适合我。

使用固定代码:

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

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

public class AddyServer {
    public static void main(String[] args) throws Exception {

        int portNumber = Integer.parseInt(args[0]);

        System.err.println("Trying...");
        ServerSocket serverSocket = new ServerSocket(portNumber);
        System.err.println("Waiting...");
        // PrintWriter out = new PrintWriter(clientSocket.getOutputStream(),
        // true);
        while (true) {
            System.err.println("Waiting...");
            Socket clientSocket = serverSocket.accept();

            System.err.println("accepted");

            BufferedReader in = new BufferedReader(new InputStreamReader(
                    clientSocket.getInputStream()));
            PrintWriter out = new PrintWriter(clientSocket.getOutputStream());

            String line;
            while ((line = in.readLine()) != null) {
                if (line.isEmpty())
                    break;
                out.print(line + "\r\n");
                System.out.print(line + "\r\n");
            }

            out.print("HTTP/1.1 200 \r\n");
            out.print("Content-Type: text/html\r\n");
            out.print("Connection: close\r\n");
            out.print("\r\n");
            out.print("<!doctype html>\n");
            out.print("<title>Test title</title>\n");
            out.print("<p>Test</p>\n");
            out.flush();  // <--- Fix is here

            System.out.print("HTTP/1.1 200 \r\n");
            System.out.print("Content-Type: text/html\r\n");
            System.out.print("Connection: close\r\n");
            System.out.print("\r\n");
            System.out.print("<!doctype html>\n");
            System.out.print("<title>Test title</title>\n");
            System.out.print("<p>Test</p>\n");

            in.close();
            out.close();
            clientSocket.close();
        }
    }
}

答案 1 :(得分:0)

您的输出没有被刷新(实际发送)。在flush()上使用PrintWriter,它应该有效。

PrintWriter并非必须自动刷新。 我的猜测是你关闭套接字(因此中断连接),然后PrintWriter能够在关闭时刷新。

作为在关闭之前立即刷新的替代方法(推荐),您可以构建具有自动行刷新功能的PrintWriter(不推荐)

PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);

在这种情况下,对printfprintlnformat的通话会将其清除(但不会拨打print)。