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.
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:
write
n'est pas nécessaire. Il sera promu automatiquement.write(byte[])
au lieu de write(int)
.