2010-05-18 5 views
13

Ich versuche, ein Bild von einer Java-Desktop-Anwendung an eine J2ME-Anwendung zu senden. Das Problem ist, dass ich diese Ausnahme bin immer:java.net.SocketException: Software verursachte Verbindungsabbruch: Socket-Schreibfehler

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

ich um auf dem Netz ausgesehen habe, und obwohl dieses Problem nicht so selten ist, ich war nicht in der Lage eine konkrete Lösung zu finden. Ich transformiere das Bild in ein Byte-Array, bevor ich es übertrage. Dies sind die Methoden, die auf der Desktop-Anwendung gefunden und auf der J2ME jeweils

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

Ich sende die Nachricht über einen LAN, und ich habe keine Probleme, wenn ich kurze Textnachricht anstelle von Bildern senden. Außerdem habe ich wireshark verwendet und es scheint, dass die Desktop-Anwendung nur einen Teil der Nachricht sendet. Jede Hilfe würde sehr geschätzt werden. Außerdem funktioniert alles am J2ME-Simulator.

Antwort

5

Bitte beachten Sie die Antworten auf Official reasons for "Software caused connection abort: socket write error"

EDIT

Ich glaube nicht, gibt es viel mehr, die im Allgemeinen gesagt werden kann, und es scheint nichts zu sein Ungewöhnliches an Ihrem Code, der zum Abbruch von Verbindungen führen würde. Ich würde jedoch beachten, dass:

  • Casting der Bytes zu Ganzzahlen für den write Aufruf ist nicht erforderlich. Es wird automatisch befördert.
  • Es wäre besser (einfacher, möglicherweise effizienter in Bezug auf den Netzwerkverkehr) write(byte[]) anstelle von write(int) zu verwenden.
  • Die empfangende Seite geht davon aus, dass jedes Byte ein vollständiges Zeichen darstellt. Je nachdem, wie die sendende Seite die zu sendenden Bytes gebildet hat, ist dies möglicherweise falsch.
  • Es wäre eine gute Idee, zunächst eine Bytezahl zu senden, damit das empfangende Ende feststellen kann, ob etwas schief gelaufen ist das gesamte Byte-Array.
+0

Ich hatte diese Antworten bereits durchgegangen. Ich schaute auf das Ereignisprotokoll von Windows, ich sah nichts Relevantes, Ereignis, obwohl ich nicht so erfahren bin, diese Protokolle durchzugehen. Zweitens habe ich auch versucht, in die shutdownOutput(); aber immer noch keinen Nutzen. Schließlich bekomme ich einen Fehler von der J2ME-Anwendung, der besagt, dass der Socket geschlossen wurde. – npinti

+0

Nun ... ich weiß nicht wie, aber ich scheine es jetzt funktionieren zu lassen. Ich habe versucht, das Casting auf einen ganzzahligen Teil zu setzen, aber das hat meine Anwendung komplett kaputt gemacht und sie komplett deaktiviert. Ich habe versucht, es heute zu senden und es hat funktioniert. Meine Vermutung ist, dass es eine externe Ursache war, wahrscheinlich der Router neu gestartet oder etwas anderes. – npinti

Verwandte Themen