遠程屏幕監視使得控制方可以在遠程主機上監視其它一臺機器,其主要實現原理就是將被控制機器的屏幕作為圖片傳送給監視方,在Java中要實現遠程屏幕監視,主要解決以下幾個問題即可: 1:將當前屏幕的顯示內容捕捉為圖片 2:將捕捉的圖片發送到遠程控制主機 3:遠程控制主機接收到在本地顯示 4:利用多線程重復上面三步達到實時更新
說起來怎么這么簡單啊,今天試著做了一下遠程屏幕監視的實驗,發現還真不是這么簡單的,把我的心得總結出來共享一下,希望對你有用。
將當前屏幕顯示內容捕捉為圖片
通過上面幾行代碼就把屏幕的當前顯示內容保存為內存中的BufferedImage對象,這個確實簡單.
將捕捉的圖片發送到遠程控制主機 要達到實時監控,怎么保證發送效率,在網絡狀況不良好時怎么保證發送時使用帶寬 因為要不停地往控制機上發送圖片,所以傳送的圖片不能太大,否則會影響實時性,當網絡狀況不好時,占用帶寬過多則更加會給實時性帶來嚴峻的考驗,解決的方法有兩個: 1:使用jpg格式的圖片進行傳輸。 jpg是一種支持高度壓縮技術的圖片格式,它所存儲的信息不包含透明度,同等質量的情形下相對來說比png,gif等格式的圖片要小很多,當然,文件大小是以圖像質量為代價的,如果你一味地追求壓縮后的大小,圖像質量就會受損了。我在實驗中使用大小為28394字節的png圖片經過jpg壓縮后大小僅剩5815字節(不是PS,整個過程全部使用Java完成)。 2:將用圖片生成的字節數據先壓縮再傳送。 這一步是仁者見仁,智者見智了,有人說沒有必要,jgp格式的圖片再壓縮也小不了多少。確實是這樣的,我在實驗中把5815字節大小的jpg經過zip壓縮后為大小變為5702,有點小作用,實際應用中壓縮與否就看你了(壓縮其它格式的圖片效果可能會明顯一點,我在實驗中把一個大小為883078字節的bmp圖片壓縮后大小僅為16849字節,很可觀,達到了52:1)。
我能想到的就是這兩點了,歡迎各位仁智雙全的人補充。下面就是這兩點用到的Java技術,Java高手就直接跳過吧。
好了,這個時候就可以把字節數組發往監控機器了,如果你發了,你就知道,問題又來了(不會吧!)。 1:既然是采用多線程發送多張圖片,那么對于一張圖片,接收方怎么知道你發完了呢? 2:如果要發其它的數據,比如鼠標點擊等,接收方又怎么區分什么時候發的是圖片,什么時候發的是其它的……
對于這兩點問題,最直接的解決方法是當數據發送完成后關閉發送字節的輸出流,第二次發送時重新建立連接(網上確實有人這樣肆無忌憚地做),這種方法采用不采用就看良心了(汗)。我采用的解決方法是,每次發送數據前都告訴接收方要發什么東西(解決問題2),同時告訴它我發了多少字節(解決問題1),接收方只要接收了這么多字節數,就表示本次發送完成,最后再發送真正要發送的內容(圖片等),說簡單點就是,發送的消息結構如下: 【標識位 大小 消息】 標識位:采用一個整型,其實是一個byte,占一個字節 大小:一個整型,占四個字節 消息:實際要發送的字節數組,長度就是字節數組的長度 這樣接收方每次都是先讀取一個整數,判斷發送方是要發送什么消息,然后再判斷消息的大小,然后再接收指定大小的消息,最后完成本次發送轉入下一次接收工作。
最后,就是使用多線程重復上面的步驟進行實時監控了。有什么問題歡迎指正。
本次實驗進行的還算成功,成功偷窺了自己的桌面。謝謝你堅持看完我這么爛的文章,向你致敬!
下面是本次實驗的運行圖: 本文所使用的源代碼: 源代碼下載
posted on 2010-02-10 10:05 凱子 閱讀(3189) 評論(10) 編輯 收藏 所屬分類: Java
Powered by: BlogJava Copyright © 凱子