繁体   English   中英

如果当前没有可用数据,请保持TCP套接字连接处于活动状态

[英]Keep TCP socket-connection alive if no data is currently available

我实现了一个小型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. HTTP服务器的客户端行为不像您期望的那样。 考虑一个浏览器。 用户可以随时关闭它,返回,导航等等,即使在页面加载过程中也是如此。 如果您在传输给客户端时遇到任何错误,除了关闭连接并忘记它之外,您无能为力。 确实,这同样适用于任何服务器,但对HTTP服务器则适用未焊接。

  2. 您没有阅读客户端发送的整个请求。 您需要读取所有标题,直到出现空白行,然后需要读取内容,直到达到Content-length:标题中指定的长度,或者读取所有块,或者直到流结束为止(视情况而定):请参阅RFC2616。其结果可能是导致 (1)处的行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM