Запись в сокет завершается неудачно после X байтов - PullRequest
0 голосов
/ 17 мая 2011

Я пытаюсь записать данные песни в сокет, однако после примерно 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 и записывает обратно в сокет.Код довольно прост, поэтому я не совсем уверен, почему он будет зависать, если соединение не будет закрыто на принимающей стороне.(Примечание: это только psuedocode, но он дает общее представление)

    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 ]

1 голос
/ 17 мая 2011

Серверный процесс на другой стороне, вероятно, имеет аварийное завершение (например, SIGKILL). Это может привести к покою соединения.

0 голосов
/ 17 мая 2011

Скорее всего, ошибка в вашем коде.Если вы можете прикрепить код, будет полезно сузить ошибку.Если вы чувствуете, что это как-то связано с заголовком, используйте wireshark, чтобы увидеть, когда это произойдет.

РЕДАКТИРОВАТЬ: я чувствую, что это как-то связано с setSoTimeout (миллисекунды), это истечет время ожидания после 5 секунд бездействия, как вы написалив коде.Это, я думаю, должно послужить причиной вашего следующего утверждения: «если одна песня делает это, все песни всего альбома делают одно и то же».

Попробуйте увеличить значение времени ожидания.

0 голосов
/ 17 мая 2011

Stacktrace сообщает, что узел (сервер или клиент) закрыл соединение, для меня это может быть то, что вы читаете (анализируете) неверный ответ сервера на клиенте или наоборот.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...