2010-05-18 7 views
13

Sto tentando di inviare un'immagine da un'applicazione desktop Java a un'applicazione J2ME. Il problema è che sto ottenendo questa eccezione:java.net.SocketException: interruzione della connessione causata dal software: errore di scrittura socket

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

Ho guardato in giro sulla rete, e anche se questo problema non è che raro, sono stato in grado di trovare una soluzione concreta. Sto trasformando l'immagine in un array di byte prima di trasferirla. Questi sono i metodi presenti sul applicazione desktop e sul J2ME, rispettivamente

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

io mando il messaggio attraverso una rete LAN, e non ho problemi quando invio brevi messaggi di testo invece di immagini. Inoltre, ho usato wireshark e sembra che l'applicazione desktop invii solo parte del messaggio. Qualsiasi aiuto sarebbe molto apprezzato. Inoltre, tutto funziona con il simulatore J2ME.

risposta

5

Si prega di fare riferimento alle risposte alle Official reasons for "Software caused connection abort: socket write error"

EDIT

Non credo che ci sia molto di più che si può dire, in generale, e non sembra essere qualcosa di insolito sulla tua codice che causerebbe l'interruzione delle connessioni. Vorrei tuttavia notare che:

  • La trasmissione dei byte a numeri interi per la chiamata write non è necessaria. Sarà promosso automaticamente.
  • Sarebbe meglio (più semplice, potenzialmente più efficiente in termini di traffico di rete) utilizzare write(byte[]) anziché write(int).
  • Il lato ricevente presuppone che ciascun byte rappresenti un carattere completo. Ciò potrebbe essere errato a seconda di come il lato mittente formasse i byte da trasmettere e
  • Sarebbe una buona idea iniziare inviando un conteggio dei byte in modo che il destinatario possa dire se qualcosa è andato storto prima che il mittente abbia inviato l'intero array di byte.
+0

Avevo già passato quelle risposte. Ho guardato il registro degli eventi di Windows, non ho visto nulla di rilevante, anche se non sono così esperto nell'esaminare questi log. In secondo luogo, ho anche provato ad aggiungere in shutdownOutput(); ma ancora nessun risultato. Infine, viene visualizzato un errore dall'applicazione J2ME che indica che il socket è stato chiuso. – npinti

+0

Beh ... non so come ma a quanto pare riesco a farlo funzionare ora. Ho provato a sostituire il casting con la parte intera, ma questo ha completamente distrutto la mia applicazione, disabilitandola completamente. Ho provato a inviarlo oggi e ha funzionato. La mia ipotesi è che fosse una causa esterna, probabilmente il router riavviato o qualcos'altro. – npinti