Android: Socket - java.net.SocketException: sendto failed: EPIPE (Broken pipe)

Я пытаюсь установить соединение с сервером с помощью сокета. Соединительная труба сломана, как показано ниже.

01-31 14:47:16.536: W/System.err(27255): java.net.SocketException: sendto failed: EPIPE (Broken pipe)
01-31 14:47:16.550: W/System.err(27255):    at libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:496)
01-31 14:47:16.550: W/System.err(27255):    at libcore.io.IoBridge.sendto(IoBridge.java:465)
01-31 14:47:16.550: W/System.err(27255):    at java.net.PlainSocketImpl.write(PlainSocketImpl.java:507)
01-31 14:47:16.550: W/System.err(27255):    at java.net.PlainSocketImpl.access$100(PlainSocketImpl.java:46)
01-31 14:47:16.664: W/NetworkManagementSocketTagger(24437): setKernelCountSet(10021, 1) failed with errno -2
01-31 14:47:16.684: W/System.err(27255):    at java.net.PlainSocketImpl$PlainSocketOutputStream.write(PlainSocketImpl.java:269)
01-31 14:47:16.693: W/System.err(27255):    at java.io.DataOutputStream.write(DataOutputStream.java:98)
01-31 14:47:16.693: W/System.err(27255):    at java.io.OutputStream.write(OutputStream.java:82)
01-31 14:47:16.693: W/System.err(27255):    at com.x.x.y.sendRec(y.java:460)
01-31 14:47:16.693: W/System.err(27255):    at com.x.x.y.access$0(y.java:384)
01-31 14:47:16.693: W/System.err(27255):    at com.x.x.y$2.run(y.java:363)
01-31 14:47:16.693: W/System.err(27255):    at java.lang.Thread.run(Thread.java:856)
01-31 14:47:16.693: W/System.err(27255): Caused by: libcore.io.ErrnoException: sendto failed: EPIPE (Broken pipe)
01-31 14:47:16.693: W/System.err(27255):    at libcore.io.Posix.sendtoBytes(Native Method)
01-31 14:47:16.693: W/System.err(27255):    at libcore.io.Posix.sendto(Posix.java:146)
01-31 14:47:16.693: W/System.err(27255):    at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:177)
01-31 14:47:16.693: W/System.err(27255):    at libcore.io.IoBridge.sendto(IoBridge.java:463)

вот код и в этой строке outStreamRec.write(bData); throwing exception.

    try {
        port = 86;
        byterecv = new byte[1040];
        clientRec = new Socket();
        clientRec.connect(new InetSocketAddress("192.168.1.36", port));
        System.out.println("Just connected to " + clientRec.getRemoteSocketAddress());
    } catch (IOException e2) {
        // TODO Auto-generated catch block
        e2.printStackTrace();
    }
    while (true) {
        try {
            System.out.println("Connecting to " + ServerUrl.url + " on port " + port);              
            OutputStream outToServerRec = clientRec.getOutputStream();
            DataOutputStream outStreamRec = new DataOutputStream(outToServerRec);

            outStreamRec.write(bData);

            InputStream inFromServerPlay = clientRec.getInputStream();
            DataInputStream inStreamPlay = new DataInputStream(inFromServerPlay);
            while ((lstream = inStreamPlay.read(byterecv)) != -1) {
                System.out.println("startrec bytearray -- " + byterecv.length);
                bos1.write(byterecv, 0, lstream);
            }                
            if (stopcall == true) {
                clientRec.close();
                break;
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Примечание. Если я закрываю соединение сокетов, то работает нормально. Но я хочу сохранить соединение живым, но я закрываю соединение сокета вручную. Onclick of stop button Я закрываю соединение.

Я сделал поиск Google, но не нашел способ исправить это. Любые предложения или идеи, как решить эту проблему?

Помощь будет оценена.

Ответ 1

Друг закрыл соединение, пока вы писали ему. Это обычно означает, что вы отправили ему то, что он не понял. Возможно, это HTTP-сервер? Или какой-либо другой протокол, который вы не реализовали в своем клиентском коде?

Ответ 2

Мои 2 цента, в любом случае это помогает любому: У нас была такая же проблема (BROKEN EPIPE), и, просматривая скрипач (или Charls, или WireShark, или другой прокси-отладчик/слушатель/и т.д.), Мы заметили, что никакой запрос не отправляется вообще.

Причина заключалась в том, что мы добавили заголовок Content-Length с неправильным значением.

НТН!

Ответ 3

Я встретил эту проблему на устройстве Samsung Tablet (GT-P5113, Android 4.2.2), приложение хорошо работает на других устройствах (Nexus 4/5/7).

Код в Libcore/io/IoBridge.java выглядит так:

public static int sendto(FileDescriptor fd, byte[] bytes, int byteOffset, int byteCount, int flags, InetAddress inetAddress, int port) throws IOException {
    boolean isDatagram = (inetAddress != null);
    if (!isDatagram && byteCount <= 0) {
        return 0;
    }
    int result;
    try {
        result = Libcore.os.sendto(fd, bytes, byteOffset, byteCount, flags, inetAddress, port);
    } catch (ErrnoException errnoException) {
        result = maybeThrowAfterSendto(isDatagram, errnoException);
    }
    return result;
}

в то время как Libcore.os.sendto() является родным.

Может быть, попробовать еще раз - хороший кандидат на обходной путь.

Ответ 4

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

Проверьте подключение к Интернету, это может быть причиной.