我已经实现了一个小型HTTP服务器,允许客户端通过HTTP连接并将音频数据流传输给它们。
我的问题是,如果当前没有可用的音频数据,连接似乎会中断,原因是客户端正在断开连接,或者是由于Android内部的其他原因。
我的行为方式如下:
serverSocket = new ServerSocket(0);
Socket socket = serverSocket.accept();
socket.setKeepAlive(true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
out.write("HTTP/1.1 200 OK\r\n");
out.write("Content-Type: audio/wav\r\n");
out.write("Accept-Ranges: none\r\n");
out.write("Connection: keep-alive\r\n"); // additionally added due to answer below
out.write("\r\n");
out.flush();
..
while(len=otherInput.read(audioBuffer)){
out.write(audioBuffer, 0, len);)
}
可以肯定的是,这只是真实代码的一部分,但它显示了我正在做的事情。 现在,如果" otherinput.read()"花了很长时间,因为目前没有可用数据,我得到了
java.net.SocketException: sendto failed: EPIPE (Broken pipe)
at libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:499)
at libcore.io.IoBridge.sendto(IoBridge.java:468)
at java.net.PlainSocketImpl.write(PlainSocketImpl.java:508)
at java.net.PlainSocketImpl.access$100(PlainSocketImpl.java:46)
at java.net.PlainSocketImpl$PlainSocketOutputStream.write(PlainSocketImpl.java:270)
at java.io.BufferedOutputStream.flushInternal(BufferedOutputStream.java:185)
at java.io.BufferedOutputStream.write(BufferedOutputStream.java:139)
谁能告诉我如何在没有手动心跳的情况下阻止连接断开/关闭?我是否错过了一些标题,或者我使用了错误的方法?
感谢您的帮助,同时尝试和搜索自己疯狂。
答案 0 :(得分:0)
这里至少有两个问题。
HTTP服务器的客户端并不像您期望的那样表现良好。考虑一下浏览器。用户可以随时关闭,返回,导航等,即使在页面加载过程中也是如此。如果您收到任何错误传输给客户端,除了关闭连接并忘记它之外,您无能为力。这同样适用于任何服务器,但它将unsolder应用于HTTP服务器。
您没有阅读客户发送的整个请求。您需要读取所有标题,直到空白行,然后您需要读取正文 - Content-length:标题中指定的长度,或所有块,或直到流结束,视情况而定:请参阅RFC 2616.这可能是因为导致(1)的行为。