Java 简单Http服务器不‘;因为输入而无法工作。read()可以';I don’我走不到尽头

Java 简单Http服务器不‘;因为输入而无法工作。read()可以';I don’我走不到尽头,java,http,httpserver,Java,Http,Httpserver,我编写了一个HttpServer,下面是代码片段: 如快照所标记,它无法工作: 这是我通过浏览器访问HttpServer时的结果: 我不知道是什么原因,有人能帮我吗 谢谢否,当套接字关闭时,InputStream将返回-1。流结束表示“文件结束”,即关闭连接。这并不意味着“不读取数据” 套接字可能仍处于打开状态,因此您的代码将阻止下一个请求,并且永远不会返回-1。在更多数据到达或流关闭之前,它不会返回 该请求可能是HTTP 1.1请求。在HTTP 1.1中,套接字将保持打开状态,以允许重新

我编写了一个HttpServer,下面是代码片段:

如快照所标记,它无法工作:

这是我通过浏览器访问HttpServer时的结果:

我不知道是什么原因,有人能帮我吗


谢谢

否,当套接字关闭时,InputStream将返回-1。流结束表示“文件结束”,即关闭连接。这并不意味着“不读取数据”

套接字可能仍处于打开状态,因此您的代码将阻止下一个请求,并且永远不会返回-1。在更多数据到达或流关闭之前,它不会返回

该请求可能是HTTP 1.1请求。在HTTP 1.1中,套接字将保持打开状态,以允许重新使用连接,除非您的服务器决定不遵守它,或者web浏览器决定关闭它。HTTP 1.1的要点是允许多个HTTP请求在单个TCP流连接上通过管道传输,并避免构建/拆卸的开销

套接字可以保持打开状态,但在长时间没有数据的情况下处于空闲状态,因此如果您尝试通过阻塞调用从中读取,代码将挂起。Java InputStream.read()调用将被阻止,因为它无法返回0,因为0是有效的字节值。无论如何,我建议您切换到另一种read()形式

最后,如果您要编写一个HTTP服务器,您不应该使用流结束作为管理传入请求的唯一方法,您需要解析或扫描合法格式的HTTP请求,并在收到请求后提供响应,然后关闭连接。实际上,您当前的方法不知道HTTP响应是格式良好还是完整

有关合法请求的格式,请参阅HTTP协议的联机RFC。请求行以CR-LF结尾(回车+换行)。您将第一行作为请求(命令)读取,然后是一个空行(仅限CR-LF),那么任何HTTP头都将是每行1个,当您收到下一个空行时,它就是请求的结束。如果要关闭套接字,至少应发出“Connection:close”标题。否则,客户端可能会认为您的服务器可以处理流水线请求


在EOS之前读取输入,然后期望能够将响应写回同一连接是没有意义的


实际上,您还没有编写类似于“简单HTTP服务器”的东西。您需要研究HTTP RFC,特别是关于请求内容长度的部分。它们是由长度分隔的,而不是流的结尾。

当没有更多数据可用时,
InputStream
应该返回
-1
,我想……但为什么它不返回-1?我不知道?在我看来,它应该。。。输出是否无限重复?不,我认为从网络读取与从文件读取不同,当我从文件读取时,当到达流的末尾时,它总是可以返回-1,但形成网络,似乎无法判断是否已到达终点。那么您的代码打印的是什么?这就是
InputStream
没有像我想象的那样运行的原因。是否无法区分0作为数据的一部分和0作为不再有数据的一部分?但数据中是否可能有0?如果是这样,为什么OP的代码不在末尾打印0?0字节(0x00)不同于“0”ASCII。不管怎样,HTTP服务器都需要处理任何字节值,但在这种情况下,它似乎在处理标准ASCII文本。
InputStreams
read bytes,不过。。。而
data
是一个
int
。ASCII文本在哪里起作用?你是对的,我读错了,他使用的是read()的零参数形式,我以为他使用的是read(byte[])形式。是的,他正在打印int值。