2017-02-04 2 views
-2

Ich versuche lokale mp3-Dateien zu streamen. Das Lied, das ich gerade teste, ist 5: 33s lang. In Chrome und Edge spielt das Lied knapp 4 Minuten vor dem Anschlag.StreamingOutput - EofException vor dem Stream fertig geschrieben

Hier ist mein Service

@Path ("clips") 
public class ClipService { 

    @GET 
    @Path(...) 
    @Produces("audio/mp3") 
    public Response streamAudio() { 

     Clip clip = ... 
     StreamingOutput output = buildStreamingOutput(clip); 
     return Response.ok(output).header(HttpHeaders.CONTENT_LENGTH,   clip.getLength()).build(); 
    } 

    private StreamingOutput buildStreamingOutput(Clip clip) 
     throws Exception { 

     return new StreamingOutput() { 
      @Override 
      public void write(final OutputStream out) 
       throws IOException, WebApplicationException { 

       byte[] buffer = new byte[1024]; 
       int bytesRead; 
       try (InputStream in = clip.getInputStream()) { 
        while ((bytesRead = in.read(buffer)) > 0) { 
         out.write(buffer, 0, bytesRead); 
        } 
        out.flush(); 
       } 
      } 
     }; 
    } 
} 

Der Clip Klasse

public class Clip { 

    private InputStream inputStream; // The file 
    private long length; // File.length() 

Und der Fehler ich erhalte ...

SEVERE: An I/O error has occurred while writing a response message entity to the container output stream. 
org.glassfish.jersey.server.internal.process.MappableException: org.eclipse.jetty.io.EofException 
    at org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundWriteTo(MappableExceptionWrapperInterceptor.java:92) 
    ... 
Caused by: org.eclipse.jetty.io.EofException 
    at org.eclipse.jetty.io.ChannelEndPoint.flush(ChannelEndPoint.java:200) 
    ... 
Caused by: java.io.IOException: An established connection was aborted by the software in your host machine 
    at sun.nio.ch.SocketDispatcher.write0(Native Method) 
    at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:51) 
    at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93) 
    at sun.nio.ch.IOUtil.write(IOUtil.java:51) 
    at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:471) 
    at org.eclipse.jetty.io.ChannelEndPoint.flush(ChannelEndPoint.java:178) 
    ... 67 more 

Ich habe versucht ServerProperties.OUTBOUND_CONTENT_LENGTH_BUFFER-0 Einstellung in meine AppConfig ohne Erfolg.

+0

Sie haben keine Informationen darüber, wer Sie abgelehnt hat, aber sehen Sie sich die Stack-Trace an. Die 'EofException' wurde durch die' IOException' verursacht, daher ist die 'IOException' hier das eigentliche Problem, also war meine Editierung korrekt und hilfreich, und deine Editierung meiner Editierung war nicht. Tu das nicht. Ich versuche dir zu helfen. – EJP

+0

Ich werde zum Vorteil der Jetty-Entwickler hinzufügen, dass das Ende der Datei beim Lesen auftritt. Ein Ende der Datei zum Schreiben zu werfen ist lächerlich. Es wäre besser gewesen, die Ausnahme gar nicht zu verpacken oder gar nicht einzufangen. – EJP

+0

Sie müssen aufhören zu raten und zu lesen beginnen. Ich habe sowohl den Grund und die Motivation für meine Bearbeitung klar angegeben, als auch was mit deinem Titel falsch war. "Mangel an Interpunktion" ist ein lächerlicher Grund, die gesamte Bearbeitung abzulehnen, die direkt von Ihrem Stack-Trace kopiert/eingefügt wurde. Wenn Sie nicht möchten, dass Ihre Frage von Personen beantwortet wird, die die zugrundeliegende "IOException" erklären können, gehen Sie richtig vor. Ich habe diesen Edit War den Moderatoren zur Kenntnis gebracht. – EJP

Antwort

0

Hier ist eine Antwort für diejenigen, die nicht wollen, nicht das, was-:)

die 2-Browser Stellt sich durch eine prätentiös behindert werden I mit Griff getestet content-type=audio/mp3 durch die ursprüngliche Anforderung Cancelling und eine zweite Sende Anfrage mit einem Bereich Header.

Here's another post Detaillierung, wie man mit einer Bereichsanforderung umgehen kann.

Verwandte Themen