關於遠程桌面客戶端桌面截圖用流傳輸,跪求求大神指點


我在做一個遠程桌面,原來用socket傳輸時候圖片在服務器端顯示了,但是經常會出現閃爍服務器端的顯示是花的。。。。。
所以我想用流來傳輸,但是現在用來傳輸遇到這幾個問題
(1).因為我是每隔100毫秒就要傳輸一張圖片,所以我如何判斷當前這張圖片是否讀取完畢,服務器端如何處理
(2)我原來學過一點java,知道java中的圖片傳輸有專門的流,但是c#中應該用哪種


跪求大神指教啊,有源碼更好,小弟我剛學c#沒多久

7 个解决方案

#1


沒有壓縮下,一個中等的屏幕需要1024 * 768 * 3 = 2.3兆字節
每秒十次,就是23兆字節,就是184兆bit。就是說百兆(bit)網絡完全支撐不了。

因此,遠程桌面圖像的難點,不太在於如何傳輸,而是在於 如何有效地壓縮數據。優化方法比如有
一、差分傳輸: 前后兩楨的圖像的差別不多,傳輸差別就可以了(可能就50字節)。
二、描述傳輸: 傳輸視窗的各種屬性,包括大小位置顏色等,由客戶端重構顯示。

如果你想鍛煉自己,不妨做一些研究。
如果你想做一個產品,建議你好好考慮那些市場上的現有產品。


#2


(1).因為我是每隔100毫秒就要傳輸一張圖片,所以我如何判斷當前這張圖片是否讀取完畢,服務器端如何處理
     圖片數據是否傳完,需要client告訴server。具體來說client發送的數據包,首先要發送完整的數據長度,
server根據這個長度,接收數據,完成業務層的數據解析。

(2)我原來學過一點java,知道java中的圖片傳輸有專門的流,但是c#中應該用哪種
傳輸圖片和傳輸文件個人感覺原理上沒啥差異

樓上已經說了,如果數據不壓縮,網絡帶寬就是瓶頸,
數據壓縮感覺內容還是挺多,之前接觸過網絡視頻服務器,是借助硬件進行移動捕捉和壓縮


#3


引用 1 樓 Forty2 的回復:
沒有壓縮下,一個中等的屏幕需要1024 * 768 * 3 = 2.3兆字節
每秒十次,就是23兆字節,就是184兆bit。就是說百兆(bit)網絡完全支撐不了。

因此,遠程桌面圖像的難點,不太在於如何傳輸,而是在於 如何有效地壓縮數據。優化方法比如有
一、差分傳輸: 前后兩楨的圖像的差別不多,傳輸差別就可以了(可能就50字節)。
二、描述傳輸: 傳輸視窗的各種屬性,包括大小位置顏色等,由客戶端重構顯示。

如果你想鍛煉自己,不妨做一些研究。
如果你想做一個產品,建議你好好考慮那些市場上的現有產品。
我去網上找找差分傳輸的資料,謝謝

#4


引用 2 樓 xian_wwq 的回復:
(1).因為我是每隔100毫秒就要傳輸一張圖片,所以我如何判斷當前這張圖片是否讀取完畢,服務器端如何處理
     圖片數據是否傳完,需要client告訴server。具體來說client發送的數據包,首先要發送完整的數據長度,
server根據這個長度,接收數據,完成業務層的數據解析。

(2)我原來學過一點java,知道java中的圖片傳輸有專門的流,但是c#中應該用哪種
傳輸圖片和傳輸文件個人感覺原理上沒啥差異

樓上已經說了,如果數據不壓縮,網絡帶寬就是瓶頸,
數據壓縮感覺內容還是挺多,之前接觸過網絡視頻服務器,是借助硬件進行移動捕捉和壓縮

我原來也學過一點java,java專名有這方面的圖片傳輸流

#5


引用 1 樓 Forty2 的回復:
沒有壓縮下,一個中等的屏幕需要1024 * 768 * 3 = 2.3兆字節
每秒十次,就是23兆字節,就是184兆bit。就是說百兆(bit)網絡完全支撐不了。

因此,遠程桌面圖像的難點,不太在於如何傳輸,而是在於 如何有效地壓縮數據。優化方法比如有
一、差分傳輸: 前后兩楨的圖像的差別不多,傳輸差別就可以了(可能就50字節)。
二、描述傳輸: 傳輸視窗的各種屬性,包括大小位置顏色等,由客戶端重構顯示。

如果你想鍛煉自己,不妨做一些研究。
如果你想做一個產品,建議你好好考慮那些市場上的現有產品。


大神,我在客戶端通過差異壓縮得到一張差異壓縮之后的圖片,傳到服務器端,怎么用這張壓縮之后的圖片去更新修改遠程桌面上的圖片
   img = GetScreenMethod();//截屏方法
            
                newBmp = new Bitmap(img);
                Bitmap bmpSave = new Bitmap(newBmp.Width, newBmp.Height);
             //   Boolean isSame = true;
                for (int x = 0; x < oldBmp.Width; x++)
                {
                    for (int y = 0; y < oldBmp.Height; y++)
                    {
                        if (newBmp.GetPixel(x, y) != oldBmp.GetPixel(x, y))
                        {                        
                            bmpSave.SetPixel(x, y, newBmp.GetPixel(x, y));
                        }
                    }
                }
                img = (Image)bmpSave;
            //    pictureBox1.Image = bmpSave;
                byte_img = ImgToByt(img); //圖片轉換成字節
              
                //mid_byte = ImgToByt(img);// 圖片轉換成字節
               // byte_img = Compress(mid_byte);  //將字節數據壓縮
                try
                {
                    socket.Send(byte_img, byte_img.Length, SocketFlags.None); //發送數據給服務器
                    bmpSave.Dispose();
                    oldBmp.Dispose();
                    oldBmp = newBmp;
                    newBmp.Dispose();
                    System.GC.Collect();
                }


這是我客戶端的代碼

#6


既然只把差異的部分保存成圖片了,那么接收到之后判斷一下有點就賦值,沒有就不賦值唄
還是循環把bmpSave里的點賦值給圖像對象就好了啊

#7


引用 6 樓 Z65443344 的回復:
既然只把差異的部分保存成圖片了,那么接收到之后判斷一下有點就賦值,沒有就不賦值唄
還是循環把bmpSave里的點賦值給圖像對象就好了啊

哦哦,謝謝,我去試試,我客戶端的代碼那樣寫沒問題吧???
尤其是將位圖bitmap轉換成image

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com