如果当前没有可用的数据,请保持TCP套接字连接存活

时间:2014-07-13 20:03:25

标签: java android serversocket keep-alive

我已经实现了一个小型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)

谁能告诉我如何在没有手动心跳的情况下阻止连接断开/关闭?我是否错过了一些标题,或者我使用了错误的方法?

感谢您的帮助,同时尝试和搜索自己疯狂。

1 个答案:

答案 0 :(得分:0)

这里至少有两个问题。

  1. HTTP服务器的客户端并不像您期望的那样表现良好。考虑一下浏览器。用户可以随时关闭,返回,导航等,即使在页面加载过程中也是如此。如果您收到任何错误传输给客户端,除了关闭连接并忘记它之外,您无能为力。这同样适用于任何服务器,但它将unsolder应用于HTTP服务器。

  2. 您没有阅读客户发送的整个请求。您需要读取所有标题,直到空白行,然后您需要读取正文 - Content-length:标题中指定的长度,或所有块,或直到流结束,视情况而定:请参阅RFC 2616.这可能是因为导致(1)的行为。