2010-05-18 17 views
13

Estoy tratando de enviar una imagen desde una aplicación de escritorio Java a una aplicación J2ME. El problema es que me estoy haciendo esta excepción:java.net.SocketException: El software provocó la interrupción de la conexión: error de escritura de socket

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

He mirado alrededor en la red, y aunque este problema no es tan raro, yo era incapaz de encontrar una solución concreta. Estoy transformando la imagen en una matriz de bytes antes de transferirla. Estos son los métodos que se encuentran en la aplicación de escritorio y en el J2ME, respectivamente

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

Estoy enviando el mensaje a través de una LAN, y no tengo problemas al enviar mensajes cortos de texto en lugar de imágenes. Además, usé wireshark y parece que la aplicación de escritorio solo está enviando parte del mensaje. Cualquier ayuda sería muy apreciada. Además, todo funciona en el simulador J2ME.

Respuesta

5

Por favor, consulte las respuestas a Official reasons for "Software caused connection abort: socket write error"

EDITAR

no creo que hay mucho más que se puede decir en general, y no parece haber nada inusual acerca de su código que haría que las conexiones aborten. Sin embargo, señalaría que:

  • No es necesario convertir los bytes en enteros para la llamada write. Se promocionará automáticamente.
  • Sería mejor (más simple, potencialmente más eficiente en términos de tráfico de red) usar write(byte[]) en lugar de write(int).
  • El lado de recepción supone que cada byte representa un carácter completo. Esto puede ser incorrecto dependiendo de cómo el lado emisor formó los bytes que se transmitirán, y
  • Sería una buena idea comenzar enviando un conteo de bytes para que el extremo receptor pueda decir si algo salió mal antes de que el remitente haya enviado toda la matriz de bytes.
+0

Ya había reparado esas respuestas. Miré el registro de eventos de Windows, no vi nada relevante, aunque no tengo experiencia en revisar estos registros. En segundo lugar, también intenté agregar el shutdownOutput(); pero aún no sirvió. Por último, recibí un error de la aplicación J2ME que decía que el socket estaba cerrado. – npinti

+0

Bueno ... No sé cómo pero parece que puedo hacerlo funcionar ahora. Traté de reemplazar la parte de conversión a entero, pero eso rompió por completo mi aplicación, deshabilitándola por completo. Intenté enviarlo hoy y funcionó. Supongo que fue una causa externa, probablemente el enrutador se reinició o algo más. – npinti

Cuestiones relacionadas