首页 > 解决方案 > 如何在 Simple Java Socket Server 中发送关闭块?

问题描述

我有一个使用 Httpcore、HttpcoreNIO 进行 HTTP 通信的服务器 A。我编写了一个 Simple Java Socket Server B 用作后端。

public void run() {
        String expectedResponse = "HTTP/1.0 200 OK\r\nServer: testServer\r\n" +
                                  "Content-Type: text/html\r\n" +
                                  "Transfer-Encoding: chunked\r\n" +
                                  "Transfer-Encoding: chunked\r\n" +
                                  "\r\n" + "<HTML>\n" + "<!DOCTYPE HTML PUBLIC " +
                                  "\"-//W3C//DTD HTML 4.0 Transitional//EN\">\n" +
                                  "<HEAD>\n" + " <TITLE>Hello World</TITLE>\n" +
                                  "</HEAD>\n" + "\n" + "<BODY BGCOLOR=\"#FDF5E6\">\n" +
                                  "<H1 ALIGN=\"CENTER\"> Hello</H1>\n" +
                                  "Sample text 123\n" +
                                  "test 123:\n" + "<PRE>";
        try {
            serverSocket = new ServerSocket(port);
            System.err.println("Server starting on port : " + port);
            while (true) {
                Socket clientSocket = serverSocket.accept();
                System.err.println("Client connected");
                BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                BufferedWriter out = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
                while (true) {
                    String s;
                    if ((s = in.readLine()) != null) {
                        System.out.println(s);
                        if (!s.isEmpty()) {
                            continue;
                        }
                    }
                    out.write(expectedOutput);
                    System.err.println("connection terminated");
                    out.close();
                    in.close();
                    clientSocket.close();
                    break;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

当服务器 A 收到来自后端 B 的响应时,我收到以下异常。

Premature end of chunk coded message body: closing chunk expected

似乎 Httpcore 在关闭连接之前需要一个 Closing 块(或零长度块)。

有人可以让我知道如何从上面的 Java Simple Socket Server 发送这个关闭块吗?

标签: javahttp-headerschunked-encodingchunkedtransfer-encoding

解决方案


传输编码分块 http 标头意味着您正在分块发送 http 正文。每个块都以“头”开头,块大小以字节为单位,“/r/n”,然后是块本身。一旦你完成了,你应该发送“0”和“/r/n”。

顺便说一句,您是否有理由两次发送“传输编码分块”http标头?


推荐阅读