一個簡單的基於HTTP協議的屏幕共享應用


HTTP協議可以能是應用層協議里使用最廣泛並且用途最多樣的一個了。我們一般使用HTTP協議來瀏覽網頁,但是HTTP協議還用來做很多其它用途。對開發人員來講很常見的一種就是用HTTP協議作為各種版本控制系統和發布系統的一種底層協議,比如SVN/GIT/WebDav等等都有HTTP的支持。甚至一些數據庫用HTTP作為鏈接的底層協議。HTTP的特點是簡單,基於文本(可讀),容易擴展(各種頭部隨便加),支持代理(讓很多沒有外網連接的主機可以通過HTTP代理訪問外部主機,實際上HTTP Proxy Tunnel可以代理別的協議),客戶端豐富(瀏覽器是各種平台標配)。

今天我用一段最簡單的代碼來實現一個屏幕共享應用。

主要基於以下技術:

1. 瀏覽器端使用HTML/Javascript請求一個圖片文件,並且不停刷新:圖片加載完成之后馬上刷新。

2.服務器端使用Java Socket實現一個簡單服務器。既然是最簡單,當然連Tomcat也不需要了。服務器提供HTML頁面和屏幕圖片兩種資源。

3.使用Java AWT Robot類來不斷抓取屏幕截圖作為返回給瀏覽器的圖片。

4.Java SWING界面作為服務器端的用戶界面。可以控制共享的屏幕等。

主要優化方法:

1.服務器端緩存屏幕圖像,並且給所有客戶端使用。顯然給每個請求一個截圖是地效率的。

2. 每次抓取 屏幕圖像后與前次對比,如果沒有變化則不更新緩存的屏幕圖像。並記錄一個更新時間戳。

3.利用HTTP頭部 Last-Modified告訴客戶端文件的時間戳。客戶端每次請求使用 If-Modified-Since來告訴服務器端上次的時間戳。服務器對比時間戳,如果沒有改變則返回HTTP 304 Not Modified。這樣可以節省流量和反應時間。

4.在3的基礎上,在返回304之前可以等待一段時間。這樣可以減少請求次數,並且帶等待期間如果屏幕有更新則馬上返回,這樣反而可以讓客戶端更快得到刷新的屏幕截圖。

上邊這些優化對於很多基於HTTP的應用都是適用的。

源代碼:

http://blog.luoxq.com/files/sharedesktop/index.html

http://blog.luoxq.com/files/sharedesktop/ShareDesktop.java

對於這個小應用,有以下方面可以提高:

1. 如果加入UPnP的支持,則服務器和客戶端可以不再一個網絡。關於UPnP可以參考另外一篇P2P和Hole Punching的博客。

2.HTML5的WebSocket等可以讓服務器端更簡單的推送。

3. 可以加入遠程控制功能。只需在JavaScript里邊把鼠標和鍵盤時間發給服務器端。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM