2010-05-18 3 views
13

J'essaie d'envoyer une image d'une application de bureau Java à une application J2ME. Le problème est que je reçois cette exception:java.net.SocketException: interruption causée par le logiciel: erreur d'écriture du socket

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

J'ai regardé sur le net, et bien que ce problème n'est pas rare, je ne pouvais pas trouver une solution concrète. Je transforme l'image en un tableau d'octets avant de le transférer. Ce sont les méthodes trouvées sur l'application de bureau et sur le J2ME respectivement

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 à travers un réseau local, et je n'ai pas de problème quand j'envoyer des messages texte courts plutôt que des images. En outre, j'ai utilisé wireshark et il semble que l'application de bureau envoie seulement une partie du message. Toute aide serait très appréciée. De plus, tout fonctionne sur le simulateur J2ME.

Répondre

5

S'il vous plaît se référer aux réponses à Official reasons for "Software caused connection abort: socket write error"

EDIT

Je ne pense pas qu'il y ait beaucoup plus que l'on peut dire en général, et il ne semble pas être quelque chose d'inhabituel au sujet de votre code qui provoquerait l'interruption des connexions. Je noterais cependant que:

  • La conversion des octets en entiers pour l'appel write est inutile. 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éception suppose que chaque octet représente un caractère complet. Cela peut être incorrect en fonction de la façon dont le côté émetteur a formé les octets à transmettre, et
  • Ce serait une bonne idée de commencer en envoyant un nombre d'octets de sorte que l'extrémité de réception puisse dire si quelque chose s'est mal passé avant que l'expéditeur l'ensemble du tableau d'octets.
+0

J'avais déjà parcouru ces réponses. J'ai regardé le journal des événements de Windows, je n'ai rien vu de pertinent, même si je n'ai pas l'habitude de parcourir ces journaux. Deuxièmement, j'ai également essayé d'ajouter dans le shutdownOutput(); mais toujours pas de résultat. Enfin, j'obtiens une erreur de l'application J2ME indiquant que le socket était fermé. – npinti

+0

Eh bien ... Je ne sais pas comment mais il me semble pouvoir le faire fonctionner maintenant. J'ai essayé de remplacer le casting par une partie entière, mais cela a complètement cassé mon application, le désactivant complètement. J'ai essayé de l'envoyer aujourd'hui et ça a marché. Ma conjecture est que c'était une cause externe, probablement le routeur a redémarré ou quelque chose d'autre. – npinti

Questions connexes