5

作家:

   socket.setSendBufferSize(1);
   socket.setTcpNoDelay(true);
   writer = new BufferedWriter(
          new OutputStreamWriter(socket.getOutputStream(), "UTF-8"));

次のように使用されます。

try {
        writer.write(packet.toXML());
        writer.flush();
        ...
    }
    catch (Exception ioe){
        if (!done) {
            done = true;
            ... 
        }       
    }

これはクライアント側のコードです。サーバーがソケット(Javaコードも)を切断すると、クライアントが5〜10分後にのみスローするのはなぜですか?デッド接続を上書きする最初の試みでスローするべきではありませんか?

ありがとう

編集:

サーバーをシャットダウンした後のTCPの状態は次のとおりです。

tcp        0      0 server:443     client:50283   FIN_WAIT2 

tcp4       0      0  cient.50283     server.443       CLOSE_WAIT

Edit2:

クライアントはAndroidアプリケーションです。電話から実行され、書き込まれた2番目のパケットがスローを引き起こします。エミュレーター(下のMac)から実行すると、4番目のwrite()がスローされます。

4

2 に答える 2

5

デッド接続を上書きする最初の試みでスローするべきではありませんか?

いいえ。わかっているのは、FINが受信されたということだけです。これは、ピアによってshutdownOutput()であった可能性があり、まだ読み取り中である可能性があります。したがって、TCPはデータを送信する必要があります。ピアが閉じている場合は、RSTを発行します。これは、TCPが後続の書き込みでアプリケーションに提供します。

于 2011-08-09T02:01:06.937 に答える
0

ドキュメントによると、読者はread()操作で-1を返す必要がありますが、一部のXmlPullparserが邪魔をしていたため、何も得られませんでした

parser.setInput(connection.reader);

したがって、ライターは上記のEJPのように動作しますが、ソースコードにアクセスできる場合は、次のようにconnection.readerをInputStreamReaderExとしてインスタンス化できます。

/ ** * @author kellogs * * / public class InputStreamReaderEx extends InputStreamReader {

/* (non-Javadoc)
 * @see java.io.BufferedReader#read()
 */
@Override
public int read() throws IOException {
    // TODO Auto-generated method stub
    int ret = super.read();

    if (ret == -1)
    {
        int l = 4;
    }

    return ret;
}

/* (non-Javadoc)
 * @see java.io.BufferedReader#read(char[], int, int)
 */
@Override
public int read(char[] buffer, int offset, int length) throws IOException {
    // TODO Auto-generated method stub
    int ret = super.read(buffer, offset, length);

    if (ret == -1)
    {
        int l = 4;
    }

    return ret;
}

}

他のピアが去ったときに通知を受け取ります

于 2011-08-09T16:52:10.313 に答える