Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.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 Apache HTTPD关闭连接或不将请求重定向到servlet容器_Java_Apache_Sockets_Tomcat_Servlets - Fatal编程技术网

Java Apache HTTPD关闭连接或不将请求重定向到servlet容器

Java Apache HTTPD关闭连接或不将请求重定向到servlet容器,java,apache,sockets,tomcat,servlets,Java,Apache,Sockets,Tomcat,Servlets,我们的系统包括两部分: 第一部分: 具有“/aaa”url映射的Servlet 第二部分: 一个简单的套接字程序,它连接到我们的servlet并传输二进制数据 该系统工作正常,但在两个部分(我们的servlet和socket程序)之间使用apachehttpd之后,HTTPD阻止了数据流 换句话说,HTTPD不会将请求重定向到Tomcat,我认为它会等待完全接收请求 启动流的请求标头为: POST /aaa HTTP/1.1 Host: mysite.com Content-Type: appl

我们的系统包括两部分:

第一部分: 具有“/aaa”url映射的Servlet

第二部分: 一个简单的套接字程序,它连接到我们的servlet并传输二进制数据

该系统工作正常,但在两个部分(我们的servlet和socket程序)之间使用apachehttpd之后,HTTPD阻止了数据流

换句话说,HTTPD不会将请求重定向到Tomcat,我认为它会等待完全接收请求

启动流的请求标头为:

POST /aaa HTTP/1.1
Host: mysite.com
Content-Type: application/octet-stream
Content-Length: 2147483647
connection: keep-alive
如果我用
传输编码:chunked
替换
内容长度:2147483647
头,请求将不会重定向到servlet

另外,如果我将
内容长度设置为较小的值,则请求将重定向到servlet,但连接将关闭

Edit1: apache错误日志文件中反复出现了以下行

[Wed Sep 07 07:30:34.180585 2016] [proxy_http:error] [pid 2253:tid 140090191890176] [client 162.93.19.34:45769] AH01114: HTTP: failed to make connection to backend: 127.0.0.1, referer: example.com/aaa/
[Wed Sep 07 07:30:34.180700 2016] [proxy:error] [pid 2253:tid 140090191890176] (111)Connection refused: AH00957: HTTP: attempt to connect to 127.0.0.1:12007 (127.0.0.1) failed

[Wed Sep 14 06:25:18.406899 2016] [proxy_http:error] [pid 27777:tid 140089871005440] (70008)Partial results are valid but processing is incomplete: [client 162.93.19.34:60284] AH01110: error reading response
您对HTTP头的建议是什么


感谢高级。

使用HTTP在客户端和服务器之间创建全双工连接是不可能的。这样做有很多问题。首先要注意的是,HTTP使用的是请求-响应模式,而不是全双工流模式。这意味着客户端发送一个请求,当发送完完整的请求后,服务器发送响应。即使使用了所谓的keep-alive,也会出现这种情况,即通过同一TCP连接发送多个请求。因为这种行为是协议的基础,所以大多数实现都会做出某些(有效的)假设,从而难以创建全双工连接。

解决 最简单的解决方案是将应用程序更改为使用请求-响应范例。如果您试图通过HTTP代理进行隧道传输,但由于某些原因确实无法改变您的范例,那么这里有一些想法

  • 使用2个连接:
每个连接都提供一个单工流。在第一个连接上执行一个简单的GET,让服务器返回一个响应,该响应要么没有内容长度头,要么有一个非常大的内容长度头(或者如果您正在执行HTTP/1.1,则可以使用分块传输编码)。另外,发送“Pragma:no cache”和“cache Control:no cache”头以防止任何代理缓存响应。然后,此响应将为您提供服务器->客户端单工流。然后在第二个连接上使用一个非常大的内容长度头进行POST,以获取客户机->服务器流(从未收到响应)。请注意,这对许多代理不起作用,因为它们永远不会转发帖子(因为它们正在等待完整的数据)

  • 使用n+1连接:
如果您使用的是URLConnection或通过某些代理,那么您将不会得到真正的客户机->服务器流(因为它们在发送请求之前会对其进行缓冲)。因此,您必须将客户端->服务器流拆分为块,并在单独的请求中发送每个块。服务器->客户端流如上所述。但是请注意,此解决方案可能意味着您将发送大量请求,如果您的服务器或代理无法处理keep alives,则这也意味着您将创建大量连接。在这两种情况下,您仍然需要编写自己的(简单的)HTTP服务器,或者使用服务器本地的API编写一些服务器端处理程序。


您能为servlet发布apache Reverse代理配置吗?我无法访问apache配置,它是apache的netMaybe日志上的主机?我将尝试获取它并在此处发布我已将apache日志作为Edit1添加到问题正文中