写入套接字在X字节后失败

时间:2011-05-17 03:01:45

标签: java sockets

我正在尝试将歌曲数据写入套接字但是在大约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的速度崩溃。

3 个答案:

答案 0 :(得分:1)

另一方的服务器进程可能有异常终止(例如SIGKILL)。这会导致连接休息。

答案 1 :(得分:0)

stacktrace说对等体(服务器或客户端)关闭了连接,对我来说,你可能正在读取(解析)服务器在客户端上的响应错误,反之亦然。

答案 2 :(得分:0)

很可能是你的代码中存在错误。如果您可以附加代码,那么缩小错误将会很有帮助。如果您认为它与标题有关,请使用wireshark查看何时发生。

编辑:我觉得它与setSoTimeout(毫秒)有关,这会在你写完代码后5秒钟不活动时超时。我想这应该是你的以下陈述的原因“如果一首歌的话,整张专辑中的所有歌曲都做同样的事情”。

尝试增加超时值。