【发布时间】:2014-07-14 06:01:47
【问题描述】:
我已经实现了一个小型 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)
谁能告诉我如何在没有手动心跳的情况下防止连接中断/关闭?我错过了一些标题还是我使用了错误的方式?
提前感谢您的帮助,同时疯狂地尝试和搜索自己。
【问题讨论】:
标签: java android serversocket keep-alive