java - 无法将流输出到浏览器

标签 java browser io stream

我刚刚写了一个小程序来测试一些东西,如下:

public class Main {

    public static void main(String[] args){
        ServerSocket serverSocket = null;
        Socket clientSocket = null;
        DataInputStream dataInputStream= null;

        BufferedWriter bufferedWriter = null;
        String line ;

        try {
            serverSocket = new ServerSocket(80);
            clientSocket = serverSocket.accept();

            dataInputStream = new DataInputStream(clientSocket.getInputStream());

            while((line = dataInputStream.readLine()) != null){
                System.out.println(line);
            }

            bufferedWriter = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
            bufferedWriter.write("HTTP/1.0 200 OK \n Date: Fri, 31 Dec 1999 23:59:59 GMT \n Content-Type: text/html \n Content-Length: 1354 \n <html>abcde<html/>");

            bufferedWriter.flush();

        } catch (IOException e) {
            System.out.println("socket port cannot be opened.");
            e.printStackTrace();
        } finally{
            try {
                serverSocket.close();
                bufferedWriter.close();
            } catch (IOException e) {
                System.out.println("socket port cannot be closed.");
                e.printStackTrace();
            }
        }


    }

}

我从网上找到了http响应格式,应该是正确的。问题是我的浏览器一直在等待响应数据(从旋转的标志判断),但是数据没有返回成功。我犯了什么错误?

我通过在浏览器中输入“localhost”连接到 Java 程序,我可以在 Java 程序中打印出请求字符串,但只是无法发送回响应。

最佳答案

首先,发送的 HTTP 消息存在一些问题:HTTP 消息的每一行都由 CR LF 分隔/结束,而不仅仅是一个换行符(尽管我怀疑这可能是问题所在,你应将“\n”替换为“\r\n”)。此外,Content-Length 不等于消息正文的实际大小,应将其替换。在实际正文之前,所有 HTTP 消息都应该有一个空行,而您没有。最后,<html/> 处的正斜杠也应该在 html 之前,像这样:</html>

总结:

bufferedWriter.write("HTTP/1.0 200 OK\r\nDate: Fri, 31 Dec 1999 23:59:59 GMT\r\nContent-Type: text/html\r\nContent-Length:18\r\n\r\n<html>abcde</html>");

现在是真正的问题:读取循环一直在等待更多数据。将 readLine() 的结果与 null 进行比较实际上并不能满足您的需求。 TCP 连接生成数据流,您永远不知道客户端是否在特定时刻刚刚停止发送数据。相反,您可以阅读直到找到一个空行,该空行标志着 HTTP 消息头的结尾。 Web 浏览器通常不会在 GET 消息中发送额外的内容,因此您不会丢失任何数据。

    BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
    while(!(line = reader.readLine()).isEmpty()){
        System.out.println(line);
    }

关于java - 无法将流输出到浏览器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11800302/

相关文章:

java - NullPointerException Google map API Android 4.4.4

javascript - 使用 javascript(dojo 或 jquery)在 iframe 中进行 Web 自动化 - 单击 iframe 中的元素

javascript - JavaScript 的替代品

regex - 将文本文件存储在结构化数组中

java - 有没有办法获得像unix中/dev/null这样的位桶的路径?

Web项目中的Java文件路径

java - 尝试使用 LinkedList 解决前 K 个频繁出现的元素

java - 如何为该数组生成不重复的随机数? (java)

javascript - 浏览器窗口居中问题

spring - 无法在 Web 应用程序(tomcat、Spring MVC)中找到 witten 文件