0

.NETRemotingアプリケーションがあります。現在、アプリケーションには、ファイルをフェッチしてバイト配列としてクライアントに送信するためにRemotingServerが必要な機能があります。バイト配列全体が一度にクライアントに送られるため、ファイルサイズが大きい場合は問題があります。

だから私はファイルの部分的な読み取りを実装することを考えています、

お気に入り

public byte[] ReadPartialFile(string fileName, int offset, int bufferSize)
{
   //use FileStream and BinaryReader to read the required (depends of offset and buffer) bytes and send them back...
}

ただし、ファイルが大きく、バッファサイズが小さい場合、FileStreamおよび関連オブジェクトがN回作成および破棄され、アプリケーションに悪影響を与える可能性があります。

また、アプリケーション(クライアントとサーバー)のメモリ消費量を急増させたくありません...

誰もがより良いアイデアを得ました...

4

1 に答える 1

2

Stream は MarshalBy Ref であるため、クライアントからサーバーにストリームを渡すことができます

public unsafe void ReadFileFromSensor(Stream destination)
{
     //server writes to stream
     destination.Write(buffer, 0, buffer.Length);
}

その逆は機能しません。リモート処理を介してストリームから読み取る場合、渡された配列はシリアル化されるため、入力されません。

この場合、配列を渡す必要なしにストリームの拡張メソッドを定義しました

public static byte[] Read(this Stream stream, int nBytesToRead, out  int nBytesRead)
{
        byte[] buffer = new byte[nBytesToRead];
        nBytesRead = stream.Read(buffer,0,nBytesToRead);
        return buffer;
}

この方法を使用して、ローカル イーサネット経由で通信します。サーバーがクライアント上のストリームにアクセスすることは問題ありません。ただし、サーバーがクライアントに接続し直す必要がある場合、他のシナリオでは問題になる可能性があります。

于 2012-07-27T13:33:44.583 に答える