我正在尝试将歌曲数据写入套接字但是在大约66338个字节之后会抛出以下异常:
E/ ( 1016): Connection reset by peer
E/ ( 1016): java.net.SocketException: Connection reset by peer
E/ ( 1016): at org.apache.harmony.luni.platform.OSNetworkSystem.writeSocketImpl(Native Method)
E/ ( 1016): at org.apache.harmony.luni.platform.OSNetworkSystem.write(OSNetworkSystem.java:723)
E/ ( 1016): at org.apache.harmony.luni.net.PlainSocketImpl.write(PlainSocketImpl.java:578)
E/ ( 1016): at org.apache.harmony.luni.net.SocketOutputStream.write(SocketOutputStream.java:59)
E/ ( 1016): at com.myprogram.StreamProxy.processRequest(StreamProxy.java:307)
E/ ( 1016): at com.myprogram.StreamProxy.run(StreamProxy.java:145)
E/ ( 1016): at java.lang.Thread.run(Thread.java:1096)
这只适用于某些歌曲,如果有一首歌,则整张专辑中的所有歌曲都会做同样的事情。我想知道它是否与歌曲的标题信息有关?
有关如何调试或修复此问题的任何建议将不胜感激。感谢。
编辑:这是从InputStream读取并写回套接字的代码。代码很简单,所以我不确定为什么它会崩溃,除非在接收端关闭连接。 (注意:这只是伪造的,但是给出了一般的想法)
InputStream data = realResponse.getEntity().getContent();
Socket socket = new ServerSocket(port, 0, InetAddress.getByAddress(new byte[] {127,0,0,1}));
socket.setSoTimeout(5000);
port = socket.getLocalPort();
Socket client = socket.accept();
...some code...
byte[] buff = new byte[1024 * 50];
while (isRunning && (readBytes = data.read(buff, 0, buff.length)) != -1) {
client.getOutputStream().write(buff, 0, readBytes);
}
另外,这可能与套接字缓冲区填满有关吗?特别是因为它似乎每次都会以64k的速度崩溃。
答案 0 :(得分:1)
另一方的服务器进程可能有异常终止(例如SIGKILL)。这会导致连接休息。
答案 1 :(得分:0)
stacktrace说对等体(服务器或客户端)关闭了连接,对我来说,你可能正在读取(解析)服务器在客户端上的响应错误,反之亦然。
答案 2 :(得分:0)
很可能是你的代码中存在错误。如果您可以附加代码,那么缩小错误将会很有帮助。如果您认为它与标题有关,请使用wireshark查看何时发生。
编辑:我觉得它与setSoTimeout(毫秒)有关,这会在你写完代码后5秒钟不活动时超时。我想这应该是你的以下陈述的原因“如果一首歌的话,整张专辑中的所有歌曲都做同样的事情”。
尝试增加超时值。