2

RMI 経由でアクセスを共有しようとしているサーバー側アプリケーションがあります。アプリケーションには、最も一般的にはファイルを表す「アイテム」の抽象表現がありますが、ストリーム (ラジオのストリーミング、センサーからのデータのストリーミング) を含むほぼすべての任意のデータを表すことができます。その結果、すべての「アイテム」は InputStream を介してアクセスされます (ファイル サイズがわかっている場合はそれを示すメソッドと一緒に)。

アプリケーションの残りの部分には RMI で十分ですが、実際には InputStreams を処理できません。

RMI を使用しているときに InputStreams にアクセスする必要があることはよくある問題だと思います。だから私は疑問に思っていました:推奨される解決策は何ですか?

クライアントが入力ストリームを送受信する必要があることに注意してください。バイト配列へのシリアル化は、ファイルだけでなくデータのストリームを実際に表しているため実行できません。

4

3 に答える 3

4

RMIIOライブラリを使用して、RMI 経由でストリームを共有します。

クラスを参照してください:com.healthmarketscience.rmiio.RemoteInputStreamおよびcom.healthmarketscience.rmiio.RemoteOutputStream

関連項目: RMIIO を使用したリモート ストリーミングのリファレンス

于 2012-08-20T12:55:54.213 に答える
0

ストリームを渡すのではなく、一種の「ストリーム ハンドル」を渡すことはできますか? つまり、それ自体はストリームではないが、オンデマンドでストリームを生成できるオブジェクトです。何かのようなもの:

public interface StreamHandle extends Serializable {
    public InputStream getStream();
}

public class WebStreamHandle implements StreamHandle {
    private URL url;
    public InputStream getStream() {
        return url.openStream();
    }
}

public class SocketStreamHandle implements StreamHandle {
    private String host;
    private int port;
    public InputStream getStream() {
        return new Socket(host, port).getInputStream();
    }
}

public class BufferStreamHandle implements StreamHandle {
    private byte[] buffer;
    public InputStream getStream() {
        return new ByteArrayInputStream(buffer);
    }
}

重要なことは、コードが実行されたマシンとは関係なく、コードがストリームを生成できるようにすることです。そのため、ファイルを参照することはできません (すべてのマシンに存在することがわかっているファイルや UNC パスでない限り) が、ネットワーク上のリソースを参照することはできます。

次に、ハンドルを渡し、オンデマンドでストリームを生成できます。

于 2012-08-20T13:39:38.253 に答える