2012-03-23 17 views
0

私はTCPソケットを介して画像を受信に問題がある[.NET 4.0]Image over TCPソケットを受信できませんか?

サーバー:

Socket s = null; 
Socket client; 
private void button1_Click(object sender, EventArgs e) 
    { 
     s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
     s.Bind(new IPEndPoint(IPAddress.Any, 9988)); 
     s.Listen(1); 
     client = s.Accept(); 

     pictureBox1.Image = Image.FromStream(new NetworkStream(client)); 
     //Server freezes here and waiting for the image .. but in the Client side.. it tells that it sent. 

     Console.WriteLine("Received."); 
    } 

クライアント:

Socket s = null; 
private void button1_Click(object sender, EventArgs e) 
    { 
     s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
     s.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9988)); 
     Rectangle bounds = Screen.GetBounds(Point.Empty); 
     Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height); 
     Graphics g = Graphics.FromImage(bitmap); 
     g.CopyFromScreen(Point.Empty, Point.Empty, bounds.Size); 
     bitmap.Save(new NetworkStream(s), ImageFormat.Png); 
     Console.WriteLine("sent."); 
    } 

編集: イムは大きなアプリケーションを作ります。画像がうまく受信していた。コードにいくつかの変更を加えたので、正確に何が変わったのかを知ることが複雑になった。今は動作していない。新しいプロジェクトを作成した。 dはコードを試しました..まだ動作しません..私はそれを行う別の方法があることを知っています..しかし、私はこのやり方を好む。 誰かがそれを修正する方法を知っていますか?

+0

多分あなたの問題がどこにあるのかを記述することで.... – Carsten

+0

@CarstenKönigはサーバーコードのそのコメントでサーバーをブロックしません。あなたはそれを読むことができますか? ! –

+0

サーバのpictureBox1コントロールまたはクラスは、png形式のバイトストリームが必要であることを理解していますか?画像のサイズを示すpng形式のメタデータが存在する可能性があり、受信側がこれを知らない場合、すべてのデータをいつ受信したかを知ることができないため、終了していない可能性があります。 –

答えて

0

ほとんどの場合、データを送信した後にソケットを閉じる必要があります。

Image.FromStream()はおそらくNetworkStreamを処理するために、これ以上のバイトがあることを示しまで待機していますが、フォームのクラスレベルでSocketを宣言しているので、それが接続されており、より多くのデータのためにサーバーが待機したまま。

+0

最後に、それがなぜ私のコードを変更した後に動作を停止した.. ..しかし、私はその接続が必要です..それを生き続けるためにとにかくありますか? –

+0

あなたはそれを生き続けることができますが、最初の画像が送信されたことをサーバーに伝えるメカニズムが必要です。次の受信バイトは新しいものに属します。つまり、追加のデータを送信する必要があります(たとえば、最初にイメージサイズを送信し、その後にイメージデータを送信するなど)。サーバー側では、データを解析して分割する必要があります。 –

1

私はあなたがイメージをバイトに変換してからバイトサイズを取得し、それをサーバーに送信し、サーバーがバッファーサイズを準備してから、クライアントがイメージのバイトを送信する必要があると思うと、それを行うにはRight Here

関連する問題