Android Http 服务器和损坏的管道

Posted

技术标签:

【中文标题】Android Http 服务器和损坏的管道【英文标题】:Android Http server and broken pipes 【发布时间】:2011-10-17 09:50:49 【问题描述】:

我正在尝试开发一个 android UPnP 应用程序,其中包含一个嵌入式 http 服务器,因此它可以通过局域网提供来自设备的媒体文件。

我使用的 Web 服务器的第一个实现是基于 Apache HttpCore http://hc.apache.org/httpcomponents-core-ga/index.html 的 ElementalHttpServer 示例。 它必须稍作改动,因为 Android 库中已经包含的 org.apache.http 元素与 httpCore jar 中包含的最新元素不同。

我试图用 jar 中的那些替换 Android 的,但这无法完成 - Android 库中的那些具有优先权。当我更改库顺序时,出现重复类的问题。

而不是罐子我包括源代码并更改数据包名称以避免重复类问题。

管道损坏和连接问题仍然存在。

我也尝试过来自 HttpCoreNIO 的 NHttpServer,因为它具有与基本 httpCore 不同的类集,并且可以包含和使用而不会与 Android 本身中的 httpCore 冲突。

然后我使用了 NanoHTTPD,它似乎在所有 HTTP 服务器中运行得最好,但仍然受到与所有其他服务器相同的问题的困扰:

java.net.SocketException: The connection was reset
at org.apache.harmony.luni.platform.OSNetworkSystem.sendStreamImpl(Native Method)
at org.apache.harmony.luni.platform.OSNetworkSystem.sendStream(OSNetworkSystem.java:498)
at org.apache.harmony.luni.net.PlainSocketImpl.write(PlainSocketImpl.java:585)
at org.apache.harmony.luni.net.SocketOutputStream.write(SocketOutputStream.java:59)
at com.zappotv.network.http.NanoHTTPD$HTTPSession.sendResponse(NanoHTTPD.java:828)
at com.zappotv.network.http.NanoHTTPD$HTTPSession.run(NanoHTTPD.java:478)
at java.lang.Thread.run(Thread.java:1096)

java.net.SocketException: Broken pipe
at org.apache.harmony.luni.platform.OSNetworkSystem.sendStreamImpl(Native Method)
at org.apache.harmony.luni.platform.OSNetworkSystem.sendStream(OSNetworkSystem.java:498)
at org.apache.harmony.luni.net.PlainSocketImpl.write(PlainSocketImpl.java:585)
at org.apache.harmony.luni.net.SocketOutputStream.write(SocketOutputStream.java:59)
at com.zappotv.network.http.NanoHTTPD$HTTPSession.sendResponse(NanoHTTPD.java:828)
at com.zappotv.network.http.NanoHTTPD$HTTPSession.run(NanoHTTPD.java:478)
at java.lang.Thread.run(Thread.java:1096)

最近我在应用程序中实现了 iJetty,但问题仍然存在。 有时,发出请求的设备会陷入无限循环的请求。

我做错了什么?标题可能有问题吗?

【问题讨论】:

这种情况即使对于小额传输也会立即发生,还是仅在一段时间/数据量之后发生? 在 2020 年使用 Nanohttpd 体验到同样的事情。在我尝试继续下载文件(内容范围)后发生。 【参考方案1】:

如果没有看到您的代码,就无法对错误说太多。但我之前需要一个 HTTP 服务器,并以 NPR 应用程序为例来解决问题。该代码是如何使用java.net.ServerSocket 的相当直接的示例。

http://code.google.com/p/npr-android-app/source/browse/Npr/src/org/npr/android/news/StreamProxy.java

【讨论】:

以上是关于Android Http 服务器和损坏的管道的主要内容,如果未能解决你的问题,请参考以下文章

Java 客户端/服务器套接字损坏的管道

发生管道损坏时如何处理 AJAX 响应?

System.IO.Exception:管道在客户端损坏

同步期间出错:管道损坏-更新Android Studio 3.23.3后

同步期间出错:管道损坏-更新Android Studio 3.23.3后

损坏管道上的发送行为