java - 为什么 Chrome 不渲染从套接字输出流获取的页面? java

标签 java sockets google-chrome http serversocket

这是我的代码:

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

class Server
{
     public static void main(String args[])
     {
          try
          {
                ServerSocket svr = new ServerSocket(8900);
                System.out.println("waiting for request");
                Socket s = svr.accept();
                System.out.println("got a request");
                InputStream in = s.getInputStream();
                OutputStream out = s.getOutputStream();

                int x;
                byte data[]= new byte[1024];

                x = in.read(data);

                String response  = "<html><head><title>HTML content via java socket</title></head><body><h2>Hi! Every Body.</h2></body></html>";
                out.write(response.getBytes());
                out.flush();

                s.close();
                svr.close();
                System.out.println("closing all");
          }
          catch(Exception ex)
          {
                System.out.println("Err : " + ex);
          }
     }
}

运行它,我希望直接进入 Chrome:127.0.0.1:8900 并获得一段漂亮的 html,但实际上 Chrome 的意思是:

此页面无法正常工作 127.0.0.1 发送了无效响应。 ERR_INVALID_HTTP_RESPONSE

而我的 Server.java 正在按我想要的方式运行。连接后,Eclipse 中的控制台显示良好:

等待请求 收到一个请求 关闭所有

所以我很困惑。请帮我解决这个问题。

最佳答案

chrome 浏览器肯定无法读取您正在编写的响应。因为它的 header 中不包含任何有关响应的信息

您的代码实际上是发送响应。您可以使用curl进行检查。 以下代码将帮助您在 chrome 中获取响应。

        ServerSocket svr = new ServerSocket(8900);
        System.out.println("waiting for request");
        Socket s = svr.accept();
        System.out.println("got a request");
        InputStream in = s.getInputStream();
        OutputStream out = s.getOutputStream();

        int x;
        byte data[] = new byte[1024];

        x = in.read(data);

        String t = "HTTP/1.1 200 OK\r\n";
        byte[] bb = t.getBytes("UTF-8");
        out.write(bb);

        t = "Content-Length: 124\r\n";
        bb = t.getBytes("UTF-8");
        out.write(bb);
        t = "Content-Type: text/html\r\n\r\n";
        bb = t.getBytes("UTF-8");
        out.write(bb);

        String response = "<html><head><title>HTML content via java socket</title></head><body><h2>Hi! Every Body.</h2></body></html>";
        out.write(response.getBytes("UTF-8"));

        t = "Connection: Closed";
        bb = t.getBytes("UTF-8");
        out.write(bb);

        out.flush();

        s.close();
        svr.close();
        System.out.println("closing all");

最重要的是,如果您更改响应,那么您必须计算Content-Length:,因为它将是您响应的长度 byte[] 和 Connection: Closed 字符串的 byte[]。

关于java - 为什么 Chrome 不渲染从套接字输出流获取的页面? java ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44316332/

相关文章:

java - 对静态变量感到困惑吗?

c# - Reactive Extensions - 在不使用 Subject 的情况下将来自 IObservable<byte[]> 的流反序列化为单独的分隔消息

c - 发送 UDP 数据包时,如何取回系统分配的传出端口? (BSD C 套接字)

javascript - "' x'的含义不是函数或其返回值不可迭代”错误

javascript - Chrome 中的窗口 onload 事件失败

java - 使用 JPA 保存 Oracle XMLType 类型列

java - 使用 getJdbcTemplate.query(sql,new Object[],rowmapper)) 时如何使用 union 运算符设置 sql 查询的参数?

css - 粗体字体在 Mac 上看起来很奇怪

java - 数字常量在 SQL 中无效

c - 奇怪的 udp 套接字 sendto 行为