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里邊把鼠標和鍵盤時間發給服務器端。
