ChunkedInput不适用于jersey

任何人都可以帮助我为什么java代码有问题并一次打印所有数据而不是将每个块作为javascript代码打印

Java代码:

import org.glassfish.jersey.client.ChunkedInput; import javax.ws.rs.client.Client; import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.core.GenericType; import javax.ws.rs.core.Response; public class RunClient { public static void main(String args[]) throws InterruptedException { Client client = ClientBuilder.newClient(); //2 is to increase amount of data and 3(seconds) is for time b/w chunked output ,can be changed final Response response = client.target("http://jerseyexample-ravikant.rhcloud.com/rest/jws/streaming/2/3").request() .get(); final ChunkedInput chunkedInput = response.readEntity(new GenericType<ChunkedInput>() { }); String chunk; while ((chunk = chunkedInput.read()) != null) { System.err.println("Next chunk received: " ); System.out.println(chunk); } } } 

JavaScript :(打开页面http://jerseyexample-ravikant.rhcloud.com/rest/jws ,然后按F12并在控制台中运行,因为不允许来自其他域的javascript调用)

 //2 is to increase amount of data and 3(seconds) is for time b/w chunked output ,can be changed var xhr = new XMLHttpRequest() xhr.open("GET", "http://jerseyexample-ravikant.rhcloud.com/rest/jws/streaming/2/3", true) xhr.onprogress = function () { console.log("PROGRESS:", xhr.responseText) ;console.log("\n"); } xhr.send() 

编辑:只是为了帮助它也工作将正常的Java连接

  String uri = "http://jerseyexample-ravikant.rhcloud.com/rest/jws/streaming/3/1"; URL url = new URL(uri); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setDoOutput(true); BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); String line; while ((line = in.readLine()) != null) { System.out.println(line); } in.close(); 

我的WebService代码

 @Path("streaming/{param}/{sleepTime}") @GET @Produces(MediaType.TEXT_PLAIN) public ChunkedOutput getChunkedStream(@PathParam("param") String loopcount,@PathParam("sleepTime") String sleepTime) throws Exception { final ChunkedOutput output = new ChunkedOutput(String.class); final Integer val=Integer.parseInt(loopcount); final Integer isleepTime=Integer.parseInt(sleepTime)*1000; new Thread(new Runnable() { @Override public void run() { try { StringBuffer chunk = null; for (int i = 0; i < 10; i++) { chunk = new StringBuffer(); for (int j = 0; j < val; j++) { chunk.append(" Message #" + i+ "#"+j); } output.write(chunk.toString()+"\n"); System.out.println("write"); Thread.sleep(isleepTime); } } catch (Exception e) { e.printStackTrace(); } finally { try { System.out.println("output.close();"); output.close(); } catch (IOException ex) { ex.printStackTrace(); } } } }).start(); return output; } 

表格jersey文档:

使用ChunkedOutput编写块很简单,只调用write()方法,它只将一个块写入输出。 输入读数稍微复杂一些。 除非被开发人员告知,否则ChunkedInput不知道如何区分字节流中的块。 为了定义自定义块边界,ChunkedInput提供了注册ChunkParser的可能性,ChunkParser从输入流中读取块并将它们分开。 Jersey提供了几个块解析器实现,如果需要,您可以实现自己的解析器来分离块。 在上面的示例中, 使用Jersey提供的默认解析器,根据\ r \ n分隔字符序列的存在来分隔块

所以你的服务器必须用\ r \ n分隔块,否则你必须注册一个ChunkParser。

假设你有一个不断完成每个块的定型,你可以尝试:

 Client client = ClientBuilder.newClient(); //2 is to increase amount of data and 3(seconds) is for time b/w chunked output ,can be changed final Response response = client.target("http://jerseyexample-ravikant.rhcloud.com/rest/jws/streaming/2/3").request() .get(); final ChunkedInput chunkedInput = response.readEntity(new GenericType>() { }); chunkedInput.setParser(ChunkedInput.createParser(BOUNDARY)); String chunk; while ((chunk = chunkedInput.read()) != null) { System.err.println("Next chunk received: " ); System.out.println(chunk); } 

虽然BOUNDARY是每个块的最终字符串。 编辑中的in.readLine解决方案将按每个换行符分解“块”,即使一个块包含\ n,它也会被解释为2个块。

    Interesting Posts