Java實現遠程屏幕監視
遠程屏幕監視使得控制方可以在遠程主機上監視其它一臺機器,其主要實現原理就是將被控制機器的屏幕作為圖片傳送給監視方,在Java中要實現遠程屏幕監視,主要解決以下幾個問題即可:
1:將當前屏幕的顯示內容捕捉為圖片
2:將捕捉的圖片發送到遠程控制主機
3:遠程控制主機接收到在本地顯示
4:利用多線程重復上面三步達到實時更新
說起來怎么這么簡單啊,今天試著做了一下遠程屏幕監視的實驗,發現還真不是這么簡單的,把我的心得總結出來共享一下,希望對你有用。
將當前屏幕顯示內容捕捉為圖片

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高手就直接跳過吧。

2

3

這兩種方法有什么差別呢?別的我不知道,就平均效率來說,第二種是第一種的2倍,我實驗中轉換了10次,使用的時間分別是125和250(單位是百分之一毫秒,機子有點慢的說).
把圖片數據轉換為字節數組

2

3

4

5

將生成的字節數組進行zip壓縮

2

3

4

5

6

好了,這個時候就可以把字節數組發往監控機器了,如果你發了,你就知道,問題又來了(不會吧!)。
1:既然是采用多線程發送多張圖片,那么對于一張圖片,接收方怎么知道你發完了呢?
2:如果要發其它的數據,比如鼠標點擊等,接收方又怎么區分什么時候發的是圖片,什么時候發的是其它的……
對于這兩點問題,最直接的解決方法是當數據發送完成后關閉發送字節的輸出流,第二次發送時重新建立連接(網上確實有人這樣肆無忌憚地做),這種方法采用不采用就看良心了(汗)。我采用的解決方法是,每次發送數據前都告訴接收方要發什么東西(解決問題2),同時告訴它我發了多少字節(解決問題1),接收方只要接收了這么多字節數,就表示本次發送完成,最后再發送真正要發送的內容(圖片等),說簡單點就是,發送的消息結構如下:
【標識位 大小 消息】
標識位:采用一個整型,其實是一個byte,占一個字節
大小:一個整型,占四個字節
消息:實際要發送的字節數組,長度就是字節數組的長度
這樣接收方每次都是先讀取一個整數,判斷發送方是要發送什么消息,然后再判斷消息的大小,然后再接收指定大小的消息,最后完成本次發送轉入下一次接收工作。

2

3

4

5

6

7

啊,真不容易,終于發送出去了!不知道那邊接收到了沒有?那現在就去追蹤報道吧。
遠程控制主機接收消息

?2

?3

?4

?5

?6



?7

?8

?9

10

11

12

13

14

15



16

17

18

19



20

21

22

23



24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

最后,就是使用多線程重復上面的步驟進行實時監控了。有什么問題歡迎指正。
本次實驗進行的還算成功,成功偷窺了自己的桌面。謝謝你堅持看完我這么爛的文章,向你致敬!
下面是本次實驗的運行圖:
本文所使用的源代碼: ?源代碼下載