Java html5音频通过移动设备上的对等设备重置连接(在PC上工作正常)

Java html5音频通过移动设备上的对等设备重置连接(在PC上工作正常),java,android,sockets,http-headers,html5-audio,Java,Android,Sockets,Http Headers,Html5 Audio,我想做的只是通过http/tcp发送一个带有我自己http头的mp3文件。在客户端,我有一个带有以下行的网页: <audio src="http://192.168.0.21:14441" controls autoplay loop> 此始终在PC浏览器(Firefox、Chrome、IE)上运行,不会出现机器对机器的问题(没有防火墙干扰) 然而,当我从移动设备(iOS和Android)运行网页时,在发送看似随机的数据量后,连接突然关闭。这是建立连接后0到2秒之间的某个时间 Ja

我想做的只是通过http/tcp发送一个带有我自己http头的mp3文件。在客户端,我有一个带有以下行的网页:

<audio src="http://192.168.0.21:14441" controls autoplay loop>
始终在PC浏览器(Firefox、Chrome、IE)上运行,不会出现机器对机器的问题(没有防火墙干扰)

然而,当我从移动设备(iOS和Android)运行网页时,在发送看似随机的数据量后,连接突然关闭。这是建立连接后0到2秒之间的某个时间

Java应用程序引发异常: java.net.SocketException:对等方重置连接:套接字写入错误

当我使用Wireshark进行评测时,它向我显示一切正常,然后突然客户端开始发送一堆
RST
消息。我尝试了多种类型的头,甚至从现有的Web服务器复制了许多头,但似乎没有任何效果

即使是像

"HTTP/1.1 200 OK\r\n"
+ "Content-Type: audio/mpeg \r\n"
+ "\r\n";
当我从电脑浏览器中打开它们,但在手机上重置连接时工作。我忘了什么重要的事了吗

更新

在移动浏览器上,它会在发送一点数据后关闭连接。它以看似随机的间隔再次连接和断开连接,有时在标题中有一个范围,有时没有。即使收到整个文件,它也会继续打开连接

我猜在发送大请求时会有某种高协议的“保护”,特别是在不稳定的移动网络上。 有什么方法可以绕过这个问题吗?不管是什么,这似乎有点过分

发生的情况是html5音频元素要求前2个字节带有范围标头。然后,当我(根据rfc2616有效地)忽略此范围并发送整个文件时,音频播放器开始表现为音频流(或者至少变得非常混乱)。这仍然只在移动浏览器上发生


解决方案可能是开始接受射程请求,这样玩家就不会感到“困惑”。我会在有时间尝试后尽快发布结果。

我认为问题出在您未显示的代码中。我的猜测是,您接受连接,然后简单地发送响应,而不阅读请求。但是,如果连接在请求未读取时关闭,这将导致连接重置。此重置如何影响客户端取决于时间,即客户端可能在获得重置之前处理了响应,或者在有时间处理响应之前找到了重置


要解决此问题,您需要在发送响应之前读取HTTP请求。

我认为问题出在您未显示的代码中。我的猜测是,您接受连接,然后简单地发送响应,而不阅读请求。但是,如果连接在请求未读取时关闭,这将导致连接重置。此重置如何影响客户端取决于时间,即客户端可能在获得重置之前处理了响应,或者在有时间处理响应之前找到了重置


要解决此问题,您需要在发送响应之前阅读HTTP请求。

感谢您的快速回复。但是,在写响应之前,我确实阅读了请求。我将把代码行添加到我的示例中。@DirkDebor:很难从您提供的一小段代码中验证您是否正确读取了请求。另一件奇怪的事情是,您试图显式地使用keep-alive(这在HTTP/1.1中是隐式的,因此不需要头),但不提供内容长度或使用使keep-alive工作所需的分块编码。您是对的。我清理了我的服务器类并完全添加了它。这只是我尝试过的众多标题中的一个,但keep alive一直都在其中。我将尝试查看删除它时会发生什么。@DirkDebor:如果我正确理解了您的代码,您将创建一个新线程,在收到请求头的结尾后发送MP3。如果客户端执行
关闭(1)
以通知您它将不再发送任何数据(但仍可能接收数据),那么您将关闭套接字-即使您没有完成发送。我明白您的意思,但只是检查了一下,输出与输入同时重置。即使我让输出保持活动状态,它仍然会重置。我在一个单独的线程中运行输出,因为您的第一篇文章认为客户端可能会发送某种响应,但它不会。当我在同一个线程中运行它时,它会在关闭连接之前首先在输出中触发异常。此外,in.readLine()正在阻塞,因此当没有收到新数据时,它会留在while循环中。感谢您的快速回复。但是,在写响应之前,我确实阅读了请求。我将把代码行添加到我的示例中。@DirkDebor:很难从您提供的一小段代码中验证您是否正确读取了请求。另一件奇怪的事情是,您试图显式地使用keep-alive(这在HTTP/1.1中是隐式的,因此不需要头),但不提供内容长度或使用使keep-alive工作所需的分块编码。您是对的。我清理了我的服务器类并完全添加了它。这只是我尝试过的众多标题中的一个,但keep alive一直都在其中。我将尝试查看删除它时会发生什么。@DirkDebor:如果我正确理解了您的代码,您将创建一个新线程,在收到请求头的结尾后发送MP3。如果客户端执行了一个
关闭(1)
来通知您它将不再发送任何数据(但仍可能接收数据),那么您将关闭套接字-即使您没有完成发送。我明白您的意思,但只是检查了一下,并在发送的同时重置输出
"HTTP/1.1 200 OK\r\n"
+ "Content-Type: audio/mpeg \r\n"
+ "\r\n";