当前位置: 首页 > 面试题库 >

ChunkedInput在球衣中不起作用

陆洛城
2023-03-14
问题内容

谁能帮我解释为什么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<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调用)

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

我的Web服务代码

@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的可能性,该块从输入流中读取块并将它们分开。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<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个块。



 类似资料:
  • 我是一个相当新开发的新泽西客户,在一些测试中遇到了一些问题。首先,我可能应该提到,我的应用程序都是客户端的,根本没有服务器端的东西。 我的问题是,我想创建实例< code > InboundJaxrsResponse 的< code>Response对象,到目前为止,我一直试图通过使用< code>Mockito和< code > Response builder . build()模拟< cod

  • 我需要在java上开发简单的web服务。我是java技术新手,根据几篇文章,我决定将JAX-RS(Jersey)与嵌入式http服务器(Grizzly2)结合使用,因为它看起来适合构建REST服务,部署似乎很简单。 在我的开发环境中,所有工作都很完美(使用IntllijIdea)。 但当我尝试在测试服务器上部署时,每个请求都返回“500内部错误”(偶数/application.wadl) 简单资源

  • 如spring boot博客所述 我尝试自定义我的对象序列化。 在我的配置中添加了一个新的配置bean之后 当我尝试输出类用户的实例时,json结果不在CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES中 也许我需要在我的Jersey配置中注册一些东西来激活我的自定义obejctMapper配置 谢谢

  • 我正在尝试通过jQuery POST将一些json数据发送到我本地机器中的jersey REST服务。 在我的服务器端,我有泽西方法来使用这个POST的JSON。 我正在请求中包装json数据。所以在服务器中,我可以在该包装类中获取请求中发送的所有数据。我的请求包装类是 问题pojo类 每当我从jquery发出如下请求时, 我在控制台中发现这个错误: 我可以通过从jQuery发送问题json并在方

  • 我正在寻找一种方法来覆盖GuiceServletContextListener中与guice绑定的jersey资源。我的代码,我正在努力工作: 但不幸的是,这不起作用,虽然我不能像接口一样将jersey资源绑定到实现,但只有work。但是这样的绑定是不可能覆盖的。如果我试图用覆盖,我会收到一个错误而@Path应该是唯一的。那么我的用例有什么解决方案吗?

  • 我使用Jersey 2.10异常映射器类来处理异常。我想返回错误状态和错误信息的JSON正文。我想得到类似的回应: Jersey没有在响应中发送JSON正文。我得到的是: 如果我将状态代码更改为200,那么我将获得预期的响应正文 请帮我找出这个问题的解决方案。 异常映射器在错误对象中填充错误消息和状态。以下是异常映射程序代码: 这是来自错误对象的代码: