web-dev-qa-db-fra.com

java.net.SocketException: le logiciel a provoqué l'abandon de la connexion: erreur d'écriture du socket

J'essaye d'envoyer une image d'une application de bureau Java) à une application J2ME. Le problème est que j'obtiens cette exception:

Java.net.SocketException: Software caused connection abort: socket write error

J'ai cherché sur le net, et bien que ce problème ne soit pas si rare, je n'ai pas pu trouver de solution concrète. Je transforme l'image en un tableau d'octets avant de la transférer. Voici les méthodes trouvées respectivement sur l'application de bureau et sur le J2ME

    public void send(String ID, byte[] serverMessage) throws Exception
    {            
        //Get the IP and Port of the person to which the message is to be sent.
        String[] connectionDetails = this.userDetails.get(ID).split(",");
        Socket sock = new Socket(InetAddress.getByName(connectionDetails[0]), Integer.parseInt(connectionDetails[1]));
        OutputStream os = sock.getOutputStream();
        for (int i = 0; i < serverMessage.length; i++)
        {
            os.write((int) serverMessage[i]);
        }
        os.flush();
        os.close();
        sock.close();
    }

    private void read(final StreamConnection slaveSock)
    {
        Runnable runnable = new Runnable()
        {
            public void run()
            {
                try
                {
                    DataInputStream dataInputStream = slaveSock.openDataInputStream();
                    int inputChar;
                    StringBuffer results = new StringBuffer();
                    while ( (inputChar = dataInputStream.read()) != -1)
                    {
                        results.append((char) inputChar);
                    }
                    dataInputStream.close();
                    slaveSock.close();
                    parseMessage(results.toString());
                    results = null;
                }

                catch(Exception e)
                {
                    e.printStackTrace();
                    Alert alertMsg = new Alert("Error", "An error has occured while reading a message from the server:\n" + e.getMessage(), null, AlertType.ERROR);
                    alertMsg.setTimeout(Alert.FOREVER);
                    myDisplay.setCurrent(alertMsg, resultScreen);
                }
            }
        };
        new Thread(runnable).start();
    }   

J'envoie le message sur un réseau local et je n'ai aucun problème lorsque j'envoie de courts messages texte au lieu d'images. De plus, j'ai utilisé WireShark et il semble que l'application de bureau n'envoie qu'une partie du message. Toute aide serait très appréciée. De plus, tout fonctionne sur le simulateur J2ME.

14
npinti

Veuillez vous référer aux réponses à Raisons officielles de "Le logiciel a provoqué un échec de connexion: erreur d'écriture de socket"

[~ # ~] modifier [~ # ~]

Je ne pense pas qu'il y ait beaucoup plus à dire en général, et il ne semble pas y avoir quoi que ce soit d'inhabituel dans votre code qui entraînerait l'abandon des connexions. Je note cependant que:

  • Le cast des octets en nombres entiers pour l'appel write n'est pas nécessaire. Il sera promu automatiquement.
  • Il serait préférable (plus simple, potentiellement plus efficace en termes de trafic réseau) d'utiliser write(byte[]) au lieu de write(int).
  • Le côté récepteur suppose que chaque octet représente un caractère complet. Cela peut être incorrect selon la façon dont le côté émetteur a formé les octets à transmettre, et
  • Ce serait une bonne idée de commencer par envoyer un nombre d'octets afin que l'extrémité de réception puisse dire si quelque chose s'est mal passé avant que l'expéditeur envoie le tableau d'octets entier.
5
Stephen C