JavaデスクトップアプリケーションからJ2MEアプリケーションに画像を送信しようとしています。問題は、次の例外が発生することです。
Java.net.SocketException: Software caused connection abort: socket write error
私はネットで周りを見回しましたが、この問題はそれほどまれではありませんが、具体的な解決策を見つけることができませんでした。転送する前に画像をバイト配列に変換しています。これらは、それぞれデスクトップアプリケーションと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();
}
LAN経由でメッセージを送信していますが、画像の代わりに短いテキストメッセージを送信しても問題はありません。また、wiresharkを使用したところ、デスクトップアプリケーションがメッセージの一部しか送信していないようです。任意の助けをいただければ幸いです。また、すべてがJ2MEシミュレータで動作します。
回答を参照してください 「ソフトウェアによって引き起こされた接続中止の正式な理由:ソケット書き込みエラー」
[〜#〜]編集[〜#〜]
一般的に言えることはこれほど多くはないと思います。また、接続が異常終了する原因となるコードに異常はないようです。ただし、次のことに注意してください。
write
呼び出しのためにバイトを整数にキャストする必要はありません。自動的に昇格されます。write(byte[])
の代わりにwrite(int)
を使用することをお勧めします(シンプルで、ネットワークトラフィックの点でより効率的です)。