web-dev-qa-db-fra.com

Android: Socket - Java.net.SocketException: sendto a échoué: EPIPE (canal cassé)

J'essaie d'établir une connexion avec le serveur à l'aide d'un socket. Le tuyau de connexion est cassé comme indiqué ci-dessous exceptions.

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)

voici le code et sur cette ligne outStreamRec.write(bData); exception de projection.

    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();
        }
    }

Remarque: Si je ferme la connexion prise fonctionne immédiatement. Mais je veux garder la connexion en vie mais je ferme la connexion de socket manuellement. En cliquant sur le bouton d'arrêt, je ferme la connexion.

J'ai fait une recherche sur Google, mais je n'ai pas trouvé le moyen de résoudre ce problème. Des suggestions ou une idée comment résoudre ceci ??

L'aide sera appréciée.

10
Rahul Baradia

Le pair a fermé la connexion pendant que vous y écriviez. Cela signifie généralement que vous avez envoyé quelque chose qu'il n'a pas compris. Est-ce peut-être un serveur HTTP? Ou un autre protocole que vous n'avez pas implémenté dans votre code client?

11
user207421

Mes 2 centimes, au cas où cela aiderait n'importe qui: Nous avions le même problème (BROKEN EPIPE), et en regardant à travers fiddler (ou Charls, ou WireShark, ou un autre debugger/auditeur/etc) nous avons remarqué qu'aucune demande ne soit envoyée du tout. 

La raison en est que nous avons ajouté l'en-tête "Content-Length" avec une valeur incorrecte. 

HTH!

3
Felix

Cela m'est arrivé aussi, et la raison idiote était que l'Internet sur l'appareil ne fonctionnait pas correctement.

Vérifiez votre connexion Internet, cela pourrait être la raison.

0
Danger

J'ai rencontré ce problème avec un appareil Samsung Tablet (GT-P5113, Android 4.2.2), l'application fonctionne bien sur d'autres appareils (Nexus 4/5/7). 

Le code dans Libcore/io/IoBridge.Java se présente comme suit:

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;
}

alors que Libcore.os.sendto () est un appel natif. 

Peut-être essayer une fois de plus est un bon candidat pour la solution de contournement. 

0
Zephyr