2012-03-23 130 views
0

我有問題,在TCP套接字接收圖像[.NET 4.0]無法通過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."); 
    } 

編輯: IM做一個大的應用程序。 。image正在收到很好..然後我做了一些代碼的變化,所以它變得很複雜,知道我究竟是什麼改變..現在它不工作..所以我做了新的項目D嘗試了代碼..仍然無法正常工作..我知道還有其他方法可以做到這一點..但我更喜歡這樣做。 任何人都知道如何解決它?

+0

也許你開始,通過描述你的問題到底在哪裏...... – Carsten 2012-03-23 12:44:35

+0

@CarstenKönig在服務器代碼中的評論..服務器沒有收到它在pictureBox線阻止..你能讀它嗎! – 2012-03-23 12:47:04

+0

服務器pictureBox1控件或類是否明白它期待一個png格式的字節流?它可能沒有完成,因爲可能有png格式的元數據表示圖像的大小,如果接收端不知道這一點,它將不知道它何時接收到所有數據? – 2012-03-23 14:52:08

回答

0

很可能您需要在發送數據後關閉套接字。

Image.FromStream()可能等到NetworkStream表示沒有更多的字節來處理,但因爲你的窗體類級別聲明的Socket,它保持連接和更多數據服務器等待。

+0

最後..這就是爲什麼它停止工作後,我修改我的代碼..!但我需要那個連接..有反正它還活着嗎? – 2012-03-23 15:39:10

+0

你可以保持它活着 - 但是然後你需要一些機制告訴服務器第一個圖像被髮送,並且下一個接收到的字節屬於一個新的。這意味着您必須發送額外的數據(例如,首先發送圖像大小,然後發送圖像數據),並且在服務器端需要解析和分割數據。 – 2012-03-23 15:43:10

1

我認爲你需要將圖像轉換爲字節,然後獲取字節的大小,並將其發送到服務器,服務器準備緩衝區大小,然後客戶端發送圖像的字節,你可以找到s視頻如何做到這一點Right Here