【问题标题】:SocketException in NanohttpdNanohttpd 中的 SocketException
【发布时间】:2016-12-07 10:48:22
【问题描述】:

我想从服务器播放 mp3 文件 服务器端代码:

if (uri.contains("mp3")) {
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(audioFile.getAbsoluteFile());

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        return newFixedLengthResponse(Response.Status.OK, MIME_TYPES.get("mp3"), fis,audioFile.getTotalSpace());
    }

当我打电话时

192.168.0.7:XXXX/mp3

错误抛出,但在浏览器中播放了 mp3 文件,为什么会出现此错误:

 java.net.SocketException: Broken pipe
                                                                                          at java.net.SocketOutputStream.socketWrite0(Native Method)
                                                                                          at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:112)
                                                                                          at java.net.SocketOutputStream.write(SocketOutputStream.java:157)
                                                                                          at fi.iki.elonen.NanoHTTPD$Response.sendBody(NanoHTTPD.java:1694)
                                                                                          at fi.iki.elonen.NanoHTTPD$Response.sendBodyWithCorrectEncoding(NanoHTTPD.java:1667)
                                                                                          at fi.iki.elonen.NanoHTTPD$Response.sendBodyWithCorrectTransferAndEncoding(NanoHTTPD.java:1657)
                                                                                          at fi.iki.elonen.NanoHTTPD$Response.send(NanoHTTPD.java:1624)
                                                                                          at fi.iki.elonen.NanoHTTPD$HTTPSession.execute(NanoHTTPD.java:957)
                                                                                          at fi.iki.elonen.NanoHTTPD$ClientHandler.run(NanoHTTPD.java:192)
                                                                                          at java.lang.Thread.run(Thread.java:761)

【问题讨论】:

  • 我也有类似的问题。我认为,由于浏览器不知道第一次调用的大小,它们只会得到文件的第一个垃圾作为第一个响应。然后他们尝试恢复下载(内容范围)并发生此异常。由于第一个连接已被删除,但 INITIAL 响应的缓冲写入器仍尝试写入输出流,因此会发生此异常。第二个请求 (PARTIAL_CONTENT) 得到一个新的响应。这是我的理论,但需要证明(调试)它!

标签: android nanohttpd


【解决方案1】:

Broken pipe 通常发生在某人(此处为服务器)试图写入另一端(此处为客户端)关闭的套接字时。

您可能应该使用length()(文件大小)而不是getTotalSpace()(分区大小)

您也可以尝试使用分块响应:

return newChunkedResponse(Response.Status.OK, MIME_TYPES.get("mp3"), fis);

【讨论】:

  • 我尝试了你的建议,但错误仍然存​​在" return newChunkedResponse(Response.Status.OK, MIME_TYPES.get("mp3"), fis);"
  • 这次发生在哪里,你能发布stacktrace吗?
  • 我拨打 192.168.0.7:XXXX/mp3 时也一样
  • 似乎由于某种原因浏览器过早地关闭了流。 mp3 是否播放完整?其他浏览器会发生什么?与其他类型的文件(浏览器是否完全下载它们)?
  • mp3 播放正常会感染整个播放,但我不明白为什么会出现此错误。
猜你喜欢
  • 2013-09-13
  • 2014-12-23
  • 1970-01-01
  • 2013-10-09
  • 1970-01-01
  • 1970-01-01
  • 2017-03-29
  • 2014-04-16
  • 1970-01-01
相关资源
最近更新 更多