ChunkedInput不适用于球衣 [英] ChunkedInput not working in jersey

查看:139
本文介绍了ChunkedInput不适用于球衣的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Can anyone help me why the java code is having issue and printing all data in one go instead of prinitng each chunk as javascript code

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<String> chunkedInput = response.readEntity(new GenericType<ChunkedInput<String>>() {
        });
        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调用)

JavaScript : (Open Page http://jerseyexample-ravikant.rhcloud.com/rest/jws and then press F12 and run below in console as javascript call not allowed from other domain)

//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连接

EDIT : Just for help it also works will normal java connection

        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();

我的网络服务代码

@Path("streaming/{param}/{sleepTime}")
@GET
@Produces(MediaType.TEXT_PLAIN)
public ChunkedOutput<String> getChunkedStream(@PathParam("param") String loopcount,@PathParam("sleepTime") String sleepTime) throws Exception {

    final ChunkedOutput<String> 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;
}


推荐答案

表格球衣文档:

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

Writing chunks with ChunkedOutput is simple, you only call method write() which writes exactly one chunk to the output. With the input reading it is slightly more complicated. The ChunkedInput does not know how to distinguish chunks in the byte stream unless being told by the developer. In order to define custom chunks boundaries, the ChunkedInput offers possibility to register a ChunkParser which reads chunks from the input stream and separates them. Jersey provides several chunk parser implementation and you can implement your own parser to separate your chunks if you need. In our example above the default parser provided by Jersey is used that separates chunks based on presence of a \r\n delimiting character sequence.

所以你的服务器必须用\\\\ n来分隔块,或者你必须注册一个ChunkParser。

So your server has to separate chunks with \r\n, or you have to register a ChunkParser.

假设你有一个不变的最终确定每个块你可以尝试:

Assuming you have a constant finalising each chunk you could try:

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<String> chunkedInput = response.readEntity(new GenericType<ChunkedInput<String>>() {
        });
        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个块。

While BOUNDARY is a finalizing string for each chunk. The in.readLine solution in your edit will break down "chunks" by every newline, even if one chunk consist a \n, it will be interpreted as 2 chunks.

这篇关于ChunkedInput不适用于球衣的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆