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里边把鼠标和键盘时间发给服务器端。

最新文章

  1. java 静态代理-积木系列
  2. iis中限制访问某个文件或某个类型的文件配置方法
  3. Java Concurrency In Practice -Chapter 2 Thread Safety
  4. git原理图解
  5. Java 打印金字塔 or 打印带数字的金字塔 (Java 学习中的小记录)
  6. Helpers\RainCaptcha
  7. 实现iOS项目一款用swift实现的应用top源码
  8. HTML5 PC、Mobile调用摄像头(navigator.getUserMedia)
  9. HOOK函数(二)——全局HOOK
  10. MySQL partition分区I
  11. 【iOS问题记录】关于UITableViewCell的高度、填充
  12. 发现C++Builder 2010一组类BUG
  13. android学习8——获取view在屏幕上的绝对坐标
  14. nodeJS模块寻址规则
  15. 【Leecode】两数之和
  16. vue.js插入dom节点的方式
  17. 排序算法之希尔排序的思想以及Java实现
  18. C#知识点提炼期末复习专用
  19. js本地储存userData实例
  20. NGINX如何反向代理Tomcat并且实现Session保持

热门文章

  1. Quicksum
  2. Gitlab 安装配置
  3. 移动前端不得不了解的HTML5 head 头标签(中下篇)
  4. apicloud教程
  5. Python基础篇-day3
  6. applicationContext.xml 配置(扫描)
  7. CSS简介模块
  8. win7下将dll文件的打开方式改回系统默认
  9. Linux文件系统的目录结构
  10. hdu_1429_胜利大逃亡(续)(BFS状压)