当服务器仅从请求中读取标头时,Http 客户端没有收到响应

程序员特隆

我正在处理 Java 中的 HTTP 和套接字,希望你能对此有所了解:

当我用 Java SE 11 编写的 HTTP 服务器没有读取整个请求然后响应时,客户端没有得到它或得到一个错误。这是为什么?在服务器读取整个请求之前,客户端是否无法读取响应?如果在下面的代码段中执行了对 readBody 的调用,这可以正常工作。如果响应具有 Content-Length 标头和文本正文,它也能正常工作。这对我来说实际上更令人费解。

我的示例请求是带有数据fds的 POST 邮递员说“无法获得任何请求”,curl 说“curl:(56) 接收失败:对等方重置连接”。

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

class Handler {

    public synchronized void read(Socket incoming) {
        try (incoming;
             OutputStream outputStream = incoming.getOutputStream();
             InputStream inputStream = incoming.getInputStream();
             PrintWriter pw = new PrintWriter(outputStream)) {

            writeRequest(inputStream);
            pw.print("HTTP/1.1 200 OK\r\n");
            pw.print("\r\n");
            pw.flush();
        } catch (IOException e) {
            System.out.println("ERROR: " + e.getMessage());
            e.printStackTrace();
        }
    }

    private void writeRequest(InputStream inputStream) throws IOException {
        String verbLine = readLine(inputStream);

        Map<String, String> headers = readHeaders(inputStream);

        //readBody(inputStream, headers);
    }

    private void readBody(InputStream inputStream, Map<String, String> headers) throws IOException {
        Optional<String> optKey = headers.keySet().stream()
                .filter(k -> k.equalsIgnoreCase("Content-Length"))
                .findFirst();
        if (optKey.isPresent()) {
            int contentLength = Integer.parseInt(headers.get(optKey.get()));
            byte[] bytes = inputStream.readNBytes(contentLength);
        }
    }

    private Map<String, String> readHeaders(InputStream inputStream) throws IOException {
        Map<String, String> headers = new HashMap<>();
        while (true) {
            String line = readLine(inputStream);
            if (line == null || line.isEmpty()) {
                return headers;
            }
            String key = line.split(":")[0].trim();
            String value = line.split(":")[1].trim();
            headers.put(key, value);
        }
    }

    private String readLine(InputStream inputStream) throws IOException {
        byte[] buf = new byte[200];
        int offset = 0;
        while (true) {
            int read = inputStream.read();
            if (read == -1) {
                return null;
            }
            buf[offset] = (byte) read;
            if (buf[0] == '\n' || (buf[0] == '\r' && buf[1] == '\n')) {
                return "";
            }
            if (buf[offset] == 0x0A) {
                int endOfLine = buf[offset - 1] == 0x0D ? offset - 1 : offset;
                return new String(buf, 0, endOfLine);
            } else {
                offset++;
            }
        }
    }
}
斯蒂芬·乌尔里希

如果在仍有未读数据的情况下关闭服务器上的套接字,则会导致客户端出现连接重置错误。这是因为您没有阅读完整的请求。如果尚未读取来自服务器的完整响应,则会向用户公开此错误。

如果您使用 a 发送响应,content-length然后发送完整的正文,则客户端将读取完整的响应,因此将忽略错误。相反,如果您既不发送content-length也不使用分块编码,则客户端将期望响应以 TCP 连接的正确关闭结束。在这种情况下,连接重置将传播给用户,因为尚未(正确)读取来自服务器的完整响应。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

客户端是否有可能收到http响应,但服务器不确定是否收到了它?

来自分类Dev

即使没有从客户端提供回调,也可以从服务器发送响应吗?

来自分类Dev

c# TCP IP客户端和服务器没有响应错误

来自分类Dev

客户端身份验证方案“基本”未授权HTTP请求。从服务器收到的身份验证标头是“ Basic realm =“ xyz””

来自分类Dev

Tomcat 8.0.18没有收到来自客户端的完整请求

来自分类Dev

gRPC Java 服务器:有没有办法获取从客户端收到的原始消息字节?

来自分类Dev

TCP 客户端(java)没有收到来自 TCP 服务器的消息(C#)

来自分类Dev

为什么我没有从我的 TCP 服务器和客户端收到任何消息?

来自分类Dev

思科AnyConnect安全移动客户端3.1.03103。VPN代理服务没有响应

来自分类Dev

在没有客户端请求的情况下在Web服务器中执行操作

来自分类Dev

在服务器关闭连接之前,客户端不会收到响应消息(Java)

来自分类Dev

检查HTML客户端是否收到服务器响应的最佳实践

来自分类Dev

libwebsocket:如果一段时间没有服务器响应(超时),如何断开客户端连接?

来自分类Dev

在 HTTP/2 中,标头如何在客户端和服务器端保持同步?

来自分类Dev

使用Nginx反向代理服务器隐藏客户端请求标头

来自分类Dev

Golang中的HTTP服务器与客户端请求

来自分类Dev

服务器收到所有数据,但客户端中HttpSendRequest返回FALSE 12002

来自分类Dev

接收服务器对客户端请求的响应

来自分类Dev

HTTP响应标头,用于识别响应请求的实际服务器

来自分类Dev

从libevent中的HTTP服务器响应获取所有HTTP标头

来自分类Dev

从libevent中的HTTP服务器响应获取所有HTTP标头

来自分类Dev

是否有可能知道HTTP响应何时到达服务器中的客户端?(ASP.NET)

来自分类Dev

从Tornado中的服务器将Content-Length标头写入客户端

来自分类Dev

没有我自己的GCM服务器的Android客户端到客户端消息传递

来自分类Dev

使用“ Range”标头时,无法从服务器获取Java的GZIPInputStream来读取服务器的“ gzip”响应

来自分类Dev

Java客户端/服务器套接字程序-服务器不响应客户端请求

来自分类Dev

带有标头请求的 HttpClient 或 Http POST 未到达服务器

来自分类Dev

Android客户端未收到服务器回复

来自分类Dev

SignalR客户端未收到服务器消息

Related 相关文章

  1. 1

    客户端是否有可能收到http响应,但服务器不确定是否收到了它?

  2. 2

    即使没有从客户端提供回调,也可以从服务器发送响应吗?

  3. 3

    c# TCP IP客户端和服务器没有响应错误

  4. 4

    客户端身份验证方案“基本”未授权HTTP请求。从服务器收到的身份验证标头是“ Basic realm =“ xyz””

  5. 5

    Tomcat 8.0.18没有收到来自客户端的完整请求

  6. 6

    gRPC Java 服务器:有没有办法获取从客户端收到的原始消息字节?

  7. 7

    TCP 客户端(java)没有收到来自 TCP 服务器的消息(C#)

  8. 8

    为什么我没有从我的 TCP 服务器和客户端收到任何消息?

  9. 9

    思科AnyConnect安全移动客户端3.1.03103。VPN代理服务没有响应

  10. 10

    在没有客户端请求的情况下在Web服务器中执行操作

  11. 11

    在服务器关闭连接之前,客户端不会收到响应消息(Java)

  12. 12

    检查HTML客户端是否收到服务器响应的最佳实践

  13. 13

    libwebsocket:如果一段时间没有服务器响应(超时),如何断开客户端连接?

  14. 14

    在 HTTP/2 中,标头如何在客户端和服务器端保持同步?

  15. 15

    使用Nginx反向代理服务器隐藏客户端请求标头

  16. 16

    Golang中的HTTP服务器与客户端请求

  17. 17

    服务器收到所有数据,但客户端中HttpSendRequest返回FALSE 12002

  18. 18

    接收服务器对客户端请求的响应

  19. 19

    HTTP响应标头,用于识别响应请求的实际服务器

  20. 20

    从libevent中的HTTP服务器响应获取所有HTTP标头

  21. 21

    从libevent中的HTTP服务器响应获取所有HTTP标头

  22. 22

    是否有可能知道HTTP响应何时到达服务器中的客户端?(ASP.NET)

  23. 23

    从Tornado中的服务器将Content-Length标头写入客户端

  24. 24

    没有我自己的GCM服务器的Android客户端到客户端消息传递

  25. 25

    使用“ Range”标头时,无法从服务器获取Java的GZIPInputStream来读取服务器的“ gzip”响应

  26. 26

    Java客户端/服务器套接字程序-服务器不响应客户端请求

  27. 27

    带有标头请求的 HttpClient 或 Http POST 未到达服务器

  28. 28

    Android客户端未收到服务器回复

  29. 29

    SignalR客户端未收到服务器消息

热门标签

归档