2016-04-01 21 views
2

imはtcpで画像を送信しようとしていますが、それは時間の約50%、残りの50%は私に黒い画像を与えています。 。なぜ誰が知っていますか?そして私はこのTCPで画像を送信する

クライアント修正することができる方法:これは、関数である

 Bitmap printscreen = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height); 
     Graphics graphics = Graphics.FromImage(printscreen as Image); 
     graphics.CopyFromScreen(0, 0, 0, 0, printscreen.Size); 
       byte[] data = imageToByteArray(Image); 
       stream = client.GetStream(); 
       int length = data.Length; 
       byte[] datalength = new byte[4]; 
       datalength = BitConverter.GetBytes(length); 
       stream.Write(datalength, 0, 4); 
       stream.Write(data, 0, data.Length); 

    while ((i = stream.Read(datalength, 0, 4)) != 0) 
       { 

        byte[] data = new byte[BitConverter.ToInt32(datalength, 0)]; 
        stream.Read(data, 0, data.Length); 
        this.Invoke((MethodInvoker)delegate 
        { 
         try 
         { 
          Image Screenshot = byteArrayToImage(data); 
          pictureBox1.Image = Screenshot; 
         } 
         catch { } 
        }); 
       } 

これは、画像にバイト配列を変換する関数である

 public Image byteArrayToImage(byte[] byteArrayIn) 
    { 
     MemoryStream ms = new MemoryStream(byteArrayIn); 
     Image returnImage = Image.FromStream(ms); 
     return returnImage; 
    } 

サーバーを画像をバイト配列に変換する

 public byte[] imageToByteArray(System.Drawing.Image imageIn) 
    { 
     MemoryStream ms = new MemoryStream(); 
     imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Gif); 
     return ms.ToArray(); 
    } 

答えて

1

「パケット」全体を必ず確認する必要があります。あなたがそれを要求しただけですべてを受け取ることは確かではありません。 Read()メソッドは、正しいバイト数を受け取るまで、読み取られたバイト数を返し、格納してループします。

これであなたの現在のRead()を交換してください:あなたの全体の画像が受信されるまで

int bytesReceived = 0; 
while(bytesReceived < data.Length) 
{ 
    bytesReceived += stream.Read(data, bytesReceived, data.Length - bytesReceived); 
} 

これが読み取られます。

編集:Ivan's answerのおかげでコードの問題を修正しました。

+0

あなたは単に "stream.Read(data、0、data.Length);"を "あなたのコードで?または "while((i = stream.Read(datalength、0、4))!= 0) –

+0

@RachelDockter: 'stream.Read(data、0、data.Length);を置き換えてください。コードは欠けているバイト数を要求し続けます。たとえば、1バイト以外のすべてを受け取った場合は、1バイトしか要求しません。 –

+0

@RachelDockter:正常に機能する場合は、投稿の左側にあるチェックマークを押して、これを受け入れられた回答としてマークしてください。 –

0

あなたは4つを読んでいるときに1000バイトを読みます。あなたは長さの言葉の後でイメージの大部分を読んで投げ捨てています。

また、read()の結果を無視して、バッファをいっぱいにしているとします。

+0

私は質問を投稿した後、私はそれを編集することに気付きました。もう少し良くなったと思うけど、そのうちのいくつかはまだ黒に戻ってくる。それは私がプログラムを再起動するまで黒のスクリーンショットを取得した後、誰もが黒になるように思えます。 –

+0

編集を参照してください。同期が外れると、同期がとれなくなります。 – EJP

+0

あなたはread()の結果を無視してabitをもっと説明できますか? im havntは長いプログラミングとネットワーキングのアイデンティティではありません –