我有一个运行在Jersey (GlassFish 3.1.1)上的RESTful Web服务,它使用HTTP流传输方式,这是有点不寻常的。客户端和服务器通过长时间运行的对话来发送编码为XML标签的消息。这样做的主要原因是服务器可以向客户端推送数据。
我有一个测试客户端,它使用HttpURLConnection。问题在于,客户端的OutputStream或服务器的InputStream可能会过早关闭。当我尝试从客户端发送一些XML时,就会抛出ProtocolException(无法在读取输入后写入输出)。
当我使用WizTools RESTClient进行测试时,我可以发布XML请求,但该工具不允许保持连接处于活动状态。但至少我知道Web服务在这种情况下起作用。 (在流传输方案中,它可能完全正常;我猜测HttpURLConnection让我失望了。)
有没有办法使HttpURLConnection保持活动状态,并让我有机会实际向OutputStream发送内容?而且,在接收到InputStream数据后,有没有办法让它继续向OutputStream写入数据?
更新:
看起来HttpURLConnection正在执行HTTP的常规用法,即客户端必须在完全发送请求(并关闭输出流)之前无法处理响应。是否有另一种方法允许请求和响应在时间上重叠?我刚开始研究Apache HttpClient,但我还没有找到任何迹象表明这是可能的,因此我不确定是否在浪费时间。
我有一个测试客户端,它使用HttpURLConnection。问题在于,客户端的OutputStream或服务器的InputStream可能会过早关闭。当我尝试从客户端发送一些XML时,就会抛出ProtocolException(无法在读取输入后写入输出)。
当我使用WizTools RESTClient进行测试时,我可以发布XML请求,但该工具不允许保持连接处于活动状态。但至少我知道Web服务在这种情况下起作用。 (在流传输方案中,它可能完全正常;我猜测HttpURLConnection让我失望了。)
有没有办法使HttpURLConnection保持活动状态,并让我有机会实际向OutputStream发送内容?而且,在接收到InputStream数据后,有没有办法让它继续向OutputStream写入数据?
更新:
看起来HttpURLConnection正在执行HTTP的常规用法,即客户端必须在完全发送请求(并关闭输出流)之前无法处理响应。是否有另一种方法允许请求和响应在时间上重叠?我刚开始研究Apache HttpClient,但我还没有找到任何迹象表明这是可能的,因此我不确定是否在浪费时间。
HttpURLConnection
可能会奏效。就像你在对@AlfredoO的评论中所说的那样,Jersey可能无法对打开/关闭/刷新连接进行细粒度控制(尽管可能有高级的配置方式来适应你的需求)。 - Michael