2017-01-05 2 views
2

Может кто-нибудь помочь мне, почему код Явы, имеющие проблемы и печати всех данных на одном дыхание вместо prinitng каждого куска, как яваскрипт кодChunkedInput не работает в Джерси

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

EDIT: Просто для помощи его также работает соединение будет нормально 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<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; 
} 

ответ

2

Форма Джерси документы:

Пишущие чанки с ChunkedOutput проста, вы только вызовите метод записи(), который пишет точно один блок на выходе. При чтении ввода это немного сложнее. ChunkedInput не знает, как отличить куски в потоке байтов, если только разработчик не сообщил. Чтобы определить границы пользовательских фрагментов, ChunkedInput предлагает возможность зарегистрировать ChunkParser, который считывает фрагменты из входного потока и разделяет их. Джерси предоставляет несколько вариантов парсера парсера, и вы можете реализовать свой собственный парсер, чтобы отделить свои куски, если вам нужно. В нашем примере выше используется синтаксический анализатор по умолчанию, предоставляемый Используется Джерси, который отделяет куски на основе наличия последовательности символов разметки \ 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); 
     } 

Хотя ГРАНИЦЫ является завершающей строкой для каждого фрагмента. Решение in.readLine в вашем правлении разбивает «куски» каждой новой линией, даже если один кусок состоит из \ n, он будет интерпретироваться как 2 куска.

+0

Все то же самое все напечатано в одном цикле, использовалось значение ГРАНИЦЫ как \ r \ n в приведенном выше коде, но все еще не работает Привет, добавил код метода веб-сервиса, вы можете его увидеть. – gladiator

+0

Попробуйте изменить output.write (chunk.toString() + "\ n"); to output.write (chunk.toString() + "\ r \ n"); – gba

+0

Спасибо, что сработало – gladiator

Смежные вопросы