Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何知道HTTP服务器何时完成数据发送_Java_Http_Browser_Proxy_Webserver - Fatal编程技术网

Java 如何知道HTTP服务器何时完成数据发送

Java 如何知道HTTP服务器何时完成数据发送,java,http,browser,proxy,webserver,Java,Http,Browser,Proxy,Webserver,我正在做一个面向浏览器/代理的项目,我需要下载网页。向web服务器发送自定义HTTP请求后,我开始侦听服务器响应 在读取响应时,我检查响应标题中的内容长度:-行。如果我得到其中一个,就很容易确定服务器何时发送完数据,因为我总是知道我收到了多少字节的数据 当服务器不包含Content-Length头并且保持连接打开以供进一步请求时,就会出现问题。例如,google服务器响应gzip内容,但不包括内容长度。如何知道何时停止等待更多数据并关闭连接 我曾考虑过在一段时间内没有收到数据时使用超时值来关闭连

我正在做一个面向浏览器/代理的项目,我需要下载网页。向web服务器发送自定义HTTP请求后,我开始侦听服务器响应

在读取响应时,我检查响应标题中的内容长度:-行。如果我得到其中一个,就很容易确定服务器何时发送完数据,因为我总是知道我收到了多少字节的数据

当服务器不包含Content-Length头并且保持连接打开以供进一步请求时,就会出现问题。例如,google服务器响应gzip内容,但不包括内容长度。如何知道何时停止等待更多数据并关闭连接


我曾考虑过在一段时间内没有收到数据时使用超时值来关闭连接,但这似乎是错误的做法。例如,Chrome可以下载与我相同的页面,并且似乎总是知道何时关闭连接。

我会尝试建议您强制
连接:关闭
标题,这样您就可以确保服务器在输出完成后关闭连接,无论
内容长度设置与否。性能将部分受此影响

您可以预期有两种情况: 1.插座闭合 2.套接字超时

通常套接字将被关闭,声明套接字超时也是有意义的

记得吗

 int stream.read(byte[],size);
返回在套接字关闭或套接字超时(或达到大小参数)之前读取的字节[]参数大小的实际大小


注意。

看看IETF RfC 2616,搜索分块编码和内容范围

HTTP旨在返回长度未知的内容,如:

HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked

25
This is the data in the first chunk

1C
and this is the second one

3
con
8
sequence
0

谢谢你的回答。这是我已经尝试过的,但是很多服务器忽略了这一点,所以它不是傻瓜式的。另外,如果你看一下Chrome发送的请求,你会发现它总是使用连接:保持活动,但仍然知道何时完成。因此,我认为这是一个错误的解决方法(即使有时它是有效的)。如果服务器忽略连接:关闭,那么您会遇到很大的问题,需要使用非常短的超时时间(如2秒)。连接:close要求服务器关闭连接。不关闭连接是违反协议的行为。此外,我可能怀疑Chrome希望标记确定“它完成了”,我不这么认为,因为在解压缩之前读取压缩文档的HTML标记是没有意义的。看看贝乌的答案。Chrome通过读取数据块大小来解决这个问题。如果这也适用于压缩数据,那么这似乎是解决这个问题的正确方法。(我假设是这样,因为我在一些缺少内容长度的请求中看到了Transfer-Encoding:header)。谢谢