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

一个简单的基于HTTP协议的屏幕共享应用的更多相关文章

  1. 通过Dapr实现一个简单的基于.net的微服务电商系统(四)——一步一步教你如何撸Dapr之订阅发布

    之前的章节我们介绍了如何通过dapr发起一个服务调用,相信看过前几章的小伙伴已经对dapr有一个基本的了解了,今天我们来聊一聊dapr的另外一个功能--订阅发布 目录:一.通过Dapr实现一个简单的基 ...

  2. 通过Dapr实现一个简单的基于.net的微服务电商系统(二十)——Saga框架实现思路分享

    今天这篇博文的主要目的是分享一下我设计Saga的实现思路来抛砖引玉,其实Saga本身非常的类似于一个简单的工作流体系,相比工作流不一样的部分在于它没有工作流的复杂逻辑处理机制(比如会签),没有条件分支 ...

  3. struts1:(Struts重构)构建一个简单的基于MVC模式的JavaWeb

    在构建一个简单的基于MVC模式的JavaWeb 中,我们使用了JSP+Servlet+JavaBean构建了一个基于MVC模式的简单登录系统,但在其小结中已经指出,这种模式下的Controller 和 ...

  4. 一个简单的基于 DirectShow 的播放器 2(对话框类)

    上篇文章分析了一个封装DirectShow各种接口的封装类(CDXGraph):一个简单的基于 DirectShow 的播放器  1(封装类) 本文继续上篇文章,分析一下调用这个封装类(CDXGrap ...

  5. 一个简单的基于 DirectShow 的播放器 1(封装类)

    DirectShow最主要的功能就是播放视频,在这里介绍一个简单的基于DirectShow的播放器的例子,是用MFC做的,今后有机会可以基于该播放器开发更复杂的播放器软件. 注:该例子取自于<D ...

  6. 并发编程概述 委托(delegate) 事件(event) .net core 2.0 event bus 一个简单的基于内存事件总线实现 .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段 基于Ace Admin 的菜单栏实现 第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)

    并发编程概述   前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...

  7. 构建一个简单的基于MVC模式的JavaWeb

    零晨三点半了,刚刚几个兄弟一起出去吼歌,才回来,这应该是我大学第二次去K歌,第一次是大一吧,之后每次兄弟喊我,我都不想去,因为我还是很害怕去KTV,或许是因为那里是我伤心的地方,也或许是因为我在那里失 ...

  8. 从零开始搭建一个简单的基于webpack的vue开发环境

    原文地址:https://segmentfault.com/a/1190000012789253?utm_source=tag-newest 从零开始搭建一个简单的基于webpack的react开发环 ...

  9. 通过Dapr实现一个简单的基于.net的微服务电商系统

    本来想在Dpar 1.0GA时发布这篇文章,由于其他事情耽搁了放到现在.时下微服务和云原生技术如何如荼,微软也不甘示弱的和阿里一起适时推出了Dapr(https://dapr.io/),园子里关于da ...

随机推荐

  1. 什么是JDBC?

    JDBC是Java数据库连接(Java DataBase Connectivity)技术的简称,提供连接各种常用数据库的能力! 1.方式一(配置文件实现): <!-- 1. 连接池实例 --&g ...

  2. iis本地无法通过ip地址访问网站

    防火墙等通通检查过没有发现问题,最后发现是我安装了一款adsafe的广告过滤软件捣的鬼,此软件设置界面没有这样的设置条款,估计是默认的配置,退出后,就ok了.

  3. Dash:程序员的好帮手

    Dash 关于Dash是什么.有哪些功能以及该怎么使用,我想直接引用咖啡 生活 美女蛇,这位小伙伴整理的很详细,我这里只说一下Dash的破解方法. 破解 破解补丁下载:Dash3.x_Cracked ...

  4. CGridCtrl在MFC中的使用(一)

    CGridCtrl控件是开源的,可在CodePlex和CodeProject上搜索找到,是VC++中用于显示表格数据的控件.基本功能包括:表格显示,单元格的编辑,单元格颜色设置,鼠标事件的响应,单元格 ...

  5. PHP 5 数据类型

    本页内容来自http://www.runoob.com/php/php-datatypes.html String(字符串), Integer(整型), Float(浮点型), Boolean(布尔型 ...

  6. linux下shell命令trap

    某些时候,在执行shell脚本(.sh)时,我们并不希望被打断.这时我们要用到trap命令. 例如: 在shell脚本中,忽略“终止”信号 trap  ' '   TERM

  7. LeetCode OJ 160. Intersection of Two Linked Lists

    Write a program to find the node at which the intersection of two singly linked lists begins. For ex ...

  8. ECOS运行环境安装(一)

    ECOS为上海商派公司研发的PHP电商框架.详情见 http://www.ec-os.net/doc.html 本文介绍CentOS6.x 64位下安装ECOS1.2运行环境的具体步骤: 1)需要准备 ...

  9. karma+jasmine自动化测试

    1.安装nodejs,进入项目目录 2.安装karma和相关插件 npm install karma --save-dev npm install karma-jasmine karma-chrome ...

  10. Ansible5:常用模块【转】

    根据zs官方的分类,将模块按功能分类为:云模块.命令模块.数据库模块.文件模块.资产模块.消息模块.监控模块.网络模块.通知模块.包管理模块.源码控制模块.系统模块.单元模块.web设施模块.wind ...