0

ソケット I/O で、objectinputstream readObject読み取るバイト数をどのように知ることができますか? コンテンツの長さはバイト自体の中にカプセル化されていますか、それとも単にバッファ自体で利用可能なすべてのバイトを読み取るだけですか?

私はPythonソケットのハウツーを参照していたので、これを尋ねています。

これについて少し考えてみると、ソケットの基本的な真実に気付くでしょう。メッセージは、固定長 (うんざり) か、区切られている (肩をすくめる) か、メッセージの長さを示す (はるかに良い) かのいずれかでなければなりません。接続をシャットダウンして終了します。選択は完全にあなた次第です(ただし、いくつかの方法は他の方法よりも正しいです).

ただし、別の SO回答では、@DavidCrawshaw は次のように述べています。

そのため、 readObject() は読み取るデータの量がわからないため、使用可能なオブジェクトの数もわかりません。

どのように機能するのか興味があります...

4

2 に答える 2

1

あなたはあなたが引用した答えを過度に解釈しています。事前にreadObject()読み取るバイト数はわかりませんが、読み取りを開始すると、タグ、プリミティブ値、およびタグで構成されるオブジェクトで構成されるプロトコルに従って入力ストリームを解析するだけです。プリミティブ値、およびその他のオブジェクト。事前に知る必要はありません。似たような XML のケースを考えてみましょう。文書や各要素がどれくらい先にあるのかはわかりませんが、プロトコルが教えてくれるので、いつすべてを読んだかがわかります。

于 2012-09-07T05:22:50.537 に答える
0

メソッドはreadOject()BlockedInputStream を使用してバイトを読み取りreadObjectます。ObjectInputStream

readObject0(false).

private Object readObject0(boolean unshared) throws IOException {
    boolean oldMode = bin.getBlockDataMode();
    if (oldMode) {
        int remain = bin.currentBlockRemaining();
        if (remain > 0) {
        throw new OptionalDataException(remain);
        } else if (defaultDataEnd) {
        /*
         * Fix for 4360508: stream is currently at the end of a field
         * value block written via default serialization; since there
         * is no terminating TC_ENDBLOCKDATA tag, simulate
         * end-of-custom-data behavior explicitly.
         */
        throw new OptionalDataException(true);
        }
        bin.setBlockDataMode(false);
    }

    byte tc;
    while ((tc = bin.peekByte()) == TC_RESET) {
        bin.readByte();
        handleReset();
    }

ストリームから読み取っているbin.readByte().ビンはBlockiedDataInputStream、順番にそれを読み取るために使用PeekInputStreamされています。このクラスは最終的にInputStream.read()を使用しています。read メソッドの説明から:

/**
     * Reads the next byte of data from the input stream. The value byte is
     * returned as an <code>int</code> in the range <code>0</code> to
     * <code>255</code>. If no byte is available because the end of the stream
     * has been reached, the value <code>-1</code> is returned. This method
     * blocks until input data is available, the end of the stream is detected,
     * or an exception is thrown.

したがって、基本的には、-1 に遭遇するまでバイトごとに読み取ります。したがって、EJP が述べたように、読み取るバイト数を事前に知ることはできません。これが理解に役立つことを願っています。

于 2012-09-07T05:53:18.467 に答える