2017-01-26 24 views
0

私はサーバー&クライアントモデルを持っています。クライアントはスクリーンショットを作成し、それをサーバーに送信することになっています。私が持っている問題は、スクリーンショットの一部です。私がこれを意味するのは、ペイントや他のアプリで開かれたときに、画面の3/4が黒であるということです。もう一度screenshotコマンドを送信すると、ファイルがまったく開いていないため、破損しています。画像がTCP経由で完全に送信されない

は、ここにあなたが見ることができるように、それは、スクリーンショットを取るビットマップファイルに画像を保存し、その後、バッファにバイトを読み込み、それを送信し、私のクライアント側

if (plainText.Contains("screenshot")) 
    { 
     Bitmap bitmap = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height); 
     Graphics graphics = Graphics.FromImage(bitmap); 
     graphics.CopyFromScreen(0, 0, 0, 0, bitmap.Size); 
     bitmap.Save("test.bmp"); 
     writebuffer = File.ReadAllBytes("test.bmp"); 
     stream.Write(writebuffer, 0, writebuffer.Length); 
    } 

です。

がここにここに私のサーバー側

foreach (user c in clientList) 
     { 
      if (c.RemoteIPAddress == currentRow) 
      { 
       NetworkStream stream = c.clientTCP.GetStream(); 
       writeBuffer = Encoding.ASCII.GetBytes("screenshot"); 
       stream.Write(writeBuffer, 0, writeBuffer.Length); 

       byte[] readBuffer = new byte[0]; 
       readBuffer = new byte[c.clientTCP.ReceiveBufferSize]; 
       int data = stream.Read(readBuffer, 0, readBuffer.Length); 

       string x = new Random().Next().ToString(); 

       FileStream f = new FileStream(new Random().Next() + ".bmp", FileMode.Create, FileAccess.Write); 
       f.Write(readBuffer, 0, data); 
       f.Close(); 
       Process.Start(x + ".bmp"); 

      } 
     } 

で、私はその後、スクリーンショットを送信するためにクライアントに通知画面が表示され、その後、ビットマップファイルへとスクリーンショットを書き込むためのコマンドを送信します。

私はこのコードで前述の問題の原因を突き止めることはできません。

+1

使用しているプロトコルは文書化されていますか?もしそうなら、送信者がファイルのサイズをどのように示していると言えますか?レシーバーがファイル全体をいつ決定するのかプロトコルが文書化されていない場合は、コードを書き込む前に* stop *して文書化してください。あなたのコードが正しいかどうかを知る方法や、正しい動作を構成するものを定義するためのプロトコル文書なしで、送信者または受信者に問題がないかどうかを判断する方法はありません。 –

+0

私は問題がドキュメントの不足ではないと思う、私は彼がなぜバイトのすべてが書かれているのか理解していないと思う。 –

答えて

4

Davidの「答え」は役に立たない。 "hurr muh protocol"あなたのコードがうまくいかない理由は、パケットの最大サイズが65535であり、イメージがそれ以上に大きくならないと仮定しているためです。すべてのパケットを読み取るには、このループを使用します。

ストリーム内でデータが使用可能かどうかをチェックし、何も残らなくなるまで読み込みます。

0

私はこのコードで前述の問題の原因を突き止めることはできません。

これはあなたには何もありません。イメージを送信するには正しい方法がたくさんあり、イメージを受け取るには多くの正しい方法があります。しかし、あなたのコードを動作させたい場合、送信者と受信者は画像の送信方法に同意する必要があります。これは「プロトコル」と呼ばれ、常に文書化されるべきです。

このプロトコルのドキュメントがある場合は、送信者がイメージのサイズをどのように示しているかを指定します。また、受信者が画像全体をどのように判断するかを指定します。次に、送信者と受信者の両方がプロトコルの指示どおりに行うことを確認することができます。もしそうであれば、それは壊れたプロトコルになります。

ネットワーク接続またはファイルを使用していて、既存のプロトコルまたは形式を使用していない場合は、文書バイトレベルで使用する予定のプロトコルまたはフォーマット。こうすることで、送信者または受信者がプロトコルの動作とその動作を比較することによって、送信者または受信者が壊れているかどうかを知ることができます。

プロトコルを使用しないと、誰と違反しているのかを判断する方法がありません。比較するための正しい動作基準がないためです。

あなたのプロトコルが文書化するのが簡単すぎるとは思わないでください。それがとてもシンプルならば、それを文書化するのは簡単なはずです。そして、文書化が複雑すぎると思うなら、それを正しく実装する祈りはありません。

ところで、送信コードが正しいプロトコルを使用することは可能です。しかし、それは非常に困難です。文字通りファイル全体があるかどうかを知る方法がないため、受信コードが正しいプロトコルを使用することは不可能です。

+0

これはおそらく始めるのに適しています。私は自分自身よりもはるかに前進していると思います。 – rrrrrrrrrrrrrrrr

+0

あなたはすべての明白な間違いをしなければならないので、最初は痛いでしょう。しかし、2回目にはそれほど痛みが少ないので、それは価値があるでしょう。その後の微風。また、コードのメンテナンスやデバッグ、相互運用する別のクライアントやサーバーの実装など、非常に貴重です。 –

関連する問題