web-dev-qa-db-ja.com

java.net.SocketException:ソフトウェアによる接続の中止:ソケット書き込みエラー

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シミュレータで動作します。

14
npinti

回答を参照してください 「ソフトウェアによって引き起こされた接続中止の正式な理由:ソケット書き込みエラー」

[〜#〜]編集[〜#〜]

一般的に言えることはこれほど多くはないと思います。また、接続が異常終了する原因となるコードに異常はないようです。ただし、次のことに注意してください。

  • write呼び出しのためにバイトを整数にキャストする必要はありません。自動的に昇格されます。
  • write(byte[])の代わりにwrite(int)を使用することをお勧めします(シンプルで、ネットワークトラフィックの点でより効率的です)。
  • 受信側は、各バイトが完全な文字を表すと想定しています。これは、送信側が送信されるバイトをどのように形成したかによって、正しくない場合があります。
  • 送信側がバイト配列全体を送信する前に、受信側が何か問題があったかどうかを確認できるように、バイトカウントを送信することから始めるのが良いでしょう。
5
Stephen C