我使用Jetty7作为REST服务器。通过处理REST请求,我支持来自Win7客户端的webdav连接。我的问题是这样的:
(1)如果我双击一个文件,客户端会发送一个文件的GET请求。当在wireshark中捕获时,它显示请求源自客户端的端口54456到服务器端口80,其中jetty正在运行。
(2)请求来到我的GET处理程序,然后我建立这样的响应:
ResponseBuilder builder = javax.ws.rs.core.Response.ok();
builder.header(“Keep-Alive”,“timeout = 15,max = 99”);
builder.header(“Connection”,“Keep-Alive”);
builder.header(“Cache-Control”,“no-store”);
builder.header(“Accept-Ranges”,“bytes”);
builder.header(“Last-Modified”,新的Rfc1123DateFormat()。format(new Date(lastModified)));
builder.header(“Content-Length”,fileLength);
InputStream in = new BufferedInputStream(in); //'in'是我从其他模块获得的InputStream并且有文件 内容。
return builder.entity(in).build();
这里,'in'是BufferedInputStream,它包含被询问的文件。
(3)文件在客户端计算机上打开。但是在我的数据包跟踪中,响应头不包含条目:Connection:Keep-Alive ... Strange !!!
(4)然后我双击客户端的文件夹。这向服务器发送了一个PROPFIND请求。请求再次从客户端的端口54456发出。我还在服务器上放了一个数据包捕获。服务器上的跟踪确认PROPFIND请求从端口号54456到达服务器.....但我的处理程序从未被调用过。最终,客户端一直在等待和超时。之后,任一客户端再次尝试或显示未找到路径的错误。
(5)但是如果PROPFIND请求来自任何其他端口(发起以前的GET请求),则jetty服务器处理它并且我的处理程序被调用...
(6)还有一个观察结果:如果来自客户端的呼叫序列是这样的:第一个客户端从客户端端口发送一个PROPFIND,例如54400,服务器响应。然后从同一个端口再次PROPFIND,然后jetty也处理它..但只有一个GET后跟一些其他请求导致jetty不响应。
我尝试在Jetty.xml文件中增加/减少maxIdleTimeOut,但没有任何帮助。 我想知道是否有可能让jetty处理这些请求...要么通过我的区域中的一些代码更改或一些配置更改。或者如果你能看到我做错了编码......
感谢, 阿尼尔。
答案 0 :(得分:0)
我在完成一些代码更改后找到了解决问题的方法。我改变了GET处理程序的实现方式。现在我接受函数参数中的HttpServletResponse并从中获取OutPutStream。然后继续读取'in'对象(输入流)并写入OutPutStream对象,该对象将直接写入客户端的响应。当然,在编写流之前,我必须设置HttpServletResponse对象的头文件。
并且,我删除了ResponseBuilder对象用法。即我完全删除了构建器对象的使用(在我上面的问题中写的)并切换到HttpServletResponse对象...
通过执行此操作,看起来像jetty不能保持连接很长时间,并且接受来自客户端的相同端口的下一个后续请求以及给予我的处理程序。