【问题标题】:Writing to socket fails after X bytesX 字节后写入套接字失败
【发布时间】:2011-05-18 18:17:37
【问题描述】:

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

【问题讨论】:

  • 能贴出相关代码吗?你更有可能以这种方式获得帮助。
  • 我发布了一些伪代码,以便更好地了解正在发生的事情。谢谢。

标签: java sockets


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    堆栈跟踪表明对等方(服务器或客户端)关闭了连接,对我而言,这可能是您正在读取(解析)错误的服务器在客户端上的响应,反之亦然。

    【讨论】:

    • 因为它是一个连接重置,它很可能意味着某些东西很糟糕(进程死亡),而不是简单的连接关闭或错误处理有线协议。
    【解决方案3】:

    错误很可能在您的代码中。如果您可以附上代码,这将有助于缩小错误范围。如果您觉得它与标头有关,请使用 wireshark 看看何时发生。

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

    尝试增加超时值。

    【讨论】:

    • 我将超时设置为 0,因此没有超时。但是,我仍然遇到同样的错误。
    猜你喜欢
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    相关资源
    最近更新 更多