2013-04-18 5 views
3

로컬 프록시 서버를 통해 미디어를 재생하고 있습니다. 새로운 Samsung Grand 기기까지 모든 것이 잘되었습니다. 특정 장치에서 우리는 다음과 같은 소켓 예외를 받고 :Samsung Grand의 미디어 플레이어 소켓 예외

4-04 17:55:35.646: W/System.err(15187): java.net.SocketException: sendto failed: ECONNRESET (Connection reset by peer) 
04-04 17:55:35.646: W/System.err(15187): at libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:506) 
04-04 17:55:35.646: W/System.err(15187): at libcore.io.IoBridge.sendto(IoBridge.java:475) 
04-04 17:55:35.646: W/System.err(15187): at java.net.PlainSocketImpl.write(PlainSocketImpl.java:507) 
04-04 17:55:35.656: W/System.err(15187): at java.net.PlainSocketImpl.access$100(PlainSocketImpl.java:46) 
04-04 17:55:35.656: W/System.err(15187): at java.net.PlainSocketImpl$PlainSocketOutputStream.write(PlainSocketImpl.java:269) 
04-04 17:55:35.656: W/System.err(15187): at java.io.BufferedOutputStream.flushInternal(BufferedOutputStream.java:185) 
04-04 17:55:35.656: W/System.err(15187): at java.io.BufferedOutputStream.write(BufferedOutputStream.java:139) 
04-04 17:55:35.656: W/System.err(15187): at com.ganeshane.music.gslib.comp.security.SecurityManager$EncryptDecryptAgent.decryptStreamWithHeaderAndFlush(SecurityManager.java:192) 
04-04 17:55:35.656: W/System.err(15187): at com.ganeshane.music.gslib.comp.player.ProxyMediaPlayer$LocalFileServer.handleGetRequest(ProxyMediaPlayer.java:315) 
04-04 17:55:35.656: W/System.err(15187): at com.ganeshane.music.gslib.comp.player.ProxyMediaPlayer$LocalFileServer.run(ProxyMediaPlayer.java:291) 
04-04 17:55:35.656: W/System.err(15187): Caused by: libcore.io.ErrnoException: sendto failed: ECONNRESET (Connection reset by peer) 
04-04 17:55:35.666: W/System.err(15187): at libcore.io.Posix.sendtoBytes(Native Method) 
04-04 17:55:35.666: W/System.err(15187): at libcore.io.Posix.sendto(Posix.java:146) 
04-04 17:55:35.666: W/System.err(15187): at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:177) 
04-04 17:55:35.666: W/System.err(15187): at libcore.io.IoBridge.sendto(IoBridge.java:473) 
04-04 17:55:35.666: W/System.err(15187): ... 8 more 

우리 GET과 머리 헤더는 다음과 같습니다

   HEAD = "HTTP/1.1 200 OK\r\n" + Date + "\r\n" 
       + "Last-Modified: Mon, 19 Jan 20013 12:51:42 GMT\r\n" 
       + "Connection: Keep-Alive\r\n" 
       + "Content-Type: audio/mpeg\r\n" 
       + "Accept-Ranges: bytes\r\n" 
       + "Server: Apache/2.2.9\r\n" + "Content-Length: " 
       + fileLength + "\r\n" + "\r\n"; 

      GET = "HTTP/1.1 200 OK\r\n" + Date + "\r\n" 
       + "Last-Modified: Mon, 19 Jan 20013 12:51:42 GMT\r\n" 
       + "Connection: Keep-Alive\r\n" 
       + "Content-Type: audio/mpeg\r\n" 
       + "Accept-Ranges: bytes\r\n" 
       + "Server: Apache/2.2.9\r\n" + "Content-Length: " 
       + fileLength + "\r\n" + "\r\n"; 

어떤 도움

이 이해할 수있을 것이다.

+0

filelength가 망하는 내용 legth를 포함하는 정수에 전체 코드를 찾을 수 있습니다. –

+0

안녕하세요. 저는 같은 문제에 직면하고 있습니다 ...이 문제에 대한 해결책을 찾았습니까? – vijaykumarg

+0

예, 단 한 번의 요청으로 모든 곡 데이터를 전송하지 마십시오. –

답변

0

내 솔루션은 Encrypted mp3 파일 이었지만 다른 용도로 사용해야합니다. 내가 직면 한 유일한 문제는 버퍼링이 완료되지 않은 경우를 찾는 것입니다. 나는 범위 끝 요구가다는 것을 확실하다, 그러나 나는 진짜로 걱정하지 않는다. 너무 시간의 99.9 % ...

아래의 관련 응답 헤더 부분을 작동하지만, 여기 https://gist.github.com/frostymarvelous/26ac6cba11bf50e591a4

if (cbSkip > 0) {// It is a seek or skip request if there's a Range 
      // header 
      headers += "HTTP/1.1 206 Partial Content\r\n"; 
      headers += "Content-Type: " + dataSource.getContentType() + "\r\n"; 
      headers += "Accept-Ranges: bytes\r\n"; 
      headers += "Content-Length: " + (fileSize - cbSkip) + "\r\n"; 
      headers += "Content-Range: bytes " + cbSkip + "-" + (fileSize - 1) + "/" + fileSize + "\r\n"; 
      headers += "Connection: Keep-Alive\r\n"; 
      headers += "\r\n"; 
     } else { 
      headers += "HTTP/1.1 200 OK\r\n"; 
      headers += "Content-Type: " + dataSource.getContentType() + "\r\n"; 
      headers += "Accept-Ranges: bytes\r\n"; 
      headers += "Content-Length: " + fileSize + "\r\n"; 
      headers += "Connection: Keep-Alive\r\n"; 
      headers += "\r\n"; 
     } 

     Log.i(TAG, "headers: " + headers); 

     OutputStream output = null; 
     byte[] buff = new byte[64 * 1024]; 
     try { 
      output = new BufferedOutputStream(client.getOutputStream(), 32 * 1024); 
      output.write(headers.getBytes()); 
      InputStream data = dataSource.getInputStream(); 

      dataSource.skipFully(data, cbSkip);//try to skip as much as possible 

      // Loop as long as there's stuff to send and client has not closed 
      int cbRead; 
      while (!client.isClosed() && (cbRead = data.read(buff, 0, buff.length)) != -1) { 
       output.write(buff, 0, cbRead); 
      } 
     }