java - 如何在 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 发送这个关闭块吗?
解决方案
传输编码分块 http 标头意味着您正在分块发送 http 正文。每个块都以“头”开头,块大小以字节为单位,“/r/n”,然后是块本身。一旦你完成了,你应该发送“0”和“/r/n”。
顺便说一句,您是否有理由两次发送“传输编码分块”http标头?
推荐阅读
- json - 导出 CLOB Json 文件
- python - 得到“ValueError:磁带仍在录制,如果您在计算梯度磁带内的雅可比时尝试重新输入已经激活的磁带,可能会发生这种情况”
- javascript - Cypress - 仅运行测试套件中的特定测试用例
- python-3.x - 对具有重复值的数据框进行排序
- r - 有没有办法将文本/值附加到 R 中的特定行?
- amazon-web-services - AWS s3 存储桶显示少 1 个文件
- jquery - 使用 Jquery 在每次滚动移动(100vh)时执行的滚动移动效果
- docker - 如何使用 Paketo.io/Cloud Native Buildpacks Docker 镜像 rebase(CI-Pipeline,如 GitHub Actions 或 renovatebot)自动创建 PR?
- javascript - React - 输入复选框 onchange 不会第一次触发
- windows - Windows 上的 PowerShell 终端中是否可以有多个选项卡