0

解決済み 問題は、読み取るように指示したときに一度にすべてのデータを取得したと想定していたため、READ SCREENSHOT メソッドから抜け出し、データ パックをパケット パーサーにダンプしていたため、コンソールに迷惑メールが送信されていました >. <

ありがとうジョン。

別の新しい問題があります。今回は、データ ストリームの何が問題なのかわかりません。現在、キャプチャされた画像ファイルを中央のネットワーク サーバーにストリーミングしようとしています。クライアント > サーバーをセットアップして、問題なく通信しています。一日中データをやり取りしていますが、スクリーンショット関数を呼び出して送信しようとすると、問題が発生します。

これに使用している現在のコードは次のとおりです。

DataHandler は、データを送受信するための単なるラッパーです。AddVar は、任意の変数を取り、ストリーム (new DataHandler(stream)) を介して送信するオーバーロードされたメソッドです。

DataHandler は TCP ストリームにリンクされています

ReadInt や ReadLong などは逆で、後でコードを簡単に保守できるようにするためのヘルパー関数です。

この時点で、サーバーは毎秒 ping をクライアントに送信します。クライアントは、別のパケットへの応答でビジーでない場合、その ping に応答するように設定されます (着信パケットは単一のスレッドで実行されます)。

サーバーはクライアントごとに同じルールに従います

データを SI.TakeScreenShotAndStream のストリームに書き込みます。このメソッドは、クライアント コンピューターのスクリーンショットを取得し、渡された任意のストリーム (この場合はメモリ ストリーム) にデータをストリーミングします。

エンドノート

(クライアント側)

try
        {
            DataHandler.AddVariable((byte)50);
            memoryStream = new MemoryStream();
            SI.TakeScreenShotAndStream(memoryStream, quality);
            DataHandler.AddVariable(memoryStream.Length);
            memoryStream.Position = 0;
            memoryStream.CopyTo(clientStream);
            clientStream.Flush();
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
            Disconnect();
        }

とサーバー側

if (!Directory.Exists(LoadedSettings.Directory + name)) Directory.CreateDirectory(LoadedSettings.Directory + name);
            fileStream = File.Create(FullPath);
            long length = DataHandler.ReadLong();
            byte[] data = new byte[length];
            clientStream.Read(data, 0, (int)length);
            fileStream.Write(data, 0, (int)length);
            fileStream.Flush();
            fileStream.Close();

「スクリーンショットを撮って保存」機能は機能します。それを FileStream にストリーミングしてファイルに直接保存できます。これを行う方法については、メモリ ストリームのチュートリアルが役立ちます。

ある時点で、MemoryStream をバイト配列に変換しようとしましたが、それもうまくいきませんでした。

また、これは混乱するだけではありません。これらは両方とも、try/catch ステートメントと無効なパケット (1、2、および 50 atm 以外のもの) にカプセル化されており、無効な例外とパケット番号の両方がコンソールに記録されます。このコードを実行すると、コンソールに大量に吐き出されるため、シャットダウンするまでビープ音が鳴り続けます(プログラムのどこにもconsole.beepコードはありません)

任意の支援をいただければ幸いです:)

4

1 に答える 1

3

ここでデータを読み取る方法は次のとおりです。

clientStream.Read(data, 0, (int)length);

代わりに、によって返される値を使用する必要がありますRead

// TODO: If you really want to handle more then 4GB per file, you'll need
// to change this...
int length = (int) DataHandler.ReadLong();
byte[] buffer = new byte[16 * 1024]; // Read up to 16K at a time

while (length > 0)
{
    int bytesRead = clientStream.Read(buffer, 0,
                                      Math.Min(length, buffer.Length));
    if (bytesRead <= 0)
    {
        // Throw an appropriate exception: the data is truncated
    }
    fileStream.Write(buffer, 0, bytesRead);
    length -= bytesRead;
}
于 2013-02-20T07:37:35.720 に答える