最近做了一个项目,里面有涉及到监控PC桌面和监视手机屏幕的功能,客户需要在PC电脑上和安卓手机上都能够观看对方的屏幕,而对方的设备既可以是PC电脑,也可以是安卓手机。

为了便于以后复习,我把这个屏幕监控的功能单独提出来做了个Demo名为ScreenMonitor来记录备忘,顺便也分享给大家。

该Demo一个包括3个项目:服务端、PC客户端、安卓客户端。

文末除了将ScreenMonitor整个项目的源码提供下载,也专门给出了可以直接部署的版本,供大家直接部署测试。

接下来,我将给大家介绍整个功能的实现原理和代码逻辑,大家可以从文末下载源码后,对照源码再来看下面的介绍就会更清晰些。  

  

一.服务端实现

  服务端主要用来转发数据(被监控的屏幕图像的编码数据),并不涉及其它复杂的业务逻辑。

这个实现起来很简单,只需要几句代码就OK,它主要做的就是将客户端的消息的处理与数据的转发。这里不做过多的介绍,其关键核心代码只有一句,就是创建OMCS多媒体服务器实例。

Program.MultimediaServer = MultimediaServerFactory.CreateMultimediaServer(9900, userVerifier, config, true);

第一个参数是提供服务的TCP端口,第二个参数用于验证登录的用户帐号密码。服务端运行界面如下所示:

  

二.PC客户端实现

  客户端中我们也分为了2种身份:控制端、被控端

  

  我们在登录时,我们需要初始化多媒体管理器 来连接服务端进行通信,其实也很简单,我们也只需要调用一句话就OK。

multimediaManager.Initialize(loginForm.CurrentUserID, "", ConfigurationManager.AppSettings["ServerIP"], int.Parse(ConfigurationManager.AppSettings["ServerPort"])); 

1.PC控制端:主要包括远程观看对方的桌面、监听对方的麦克风 2个功能

  

  实现中主要是用到了DesktopConnector这个自定义控件,我们也只需简单的调用一个BeginConnect 方法就可以直接连接到对方桌面。将控件还提供了2个事件 ConnectEnded、Disconnected 来知道当前连接的结果和状态

public DesktopForm(string friendID,bool audioEnabled){InitializeComponent();this.ownerID = friendID;this.Text = string.Format("正在访问{0}的桌面", this.ownerID);          this.desktopConnector1.ConnectEnded += new CbGeneric<ConnectResult>(desktopConnector1_ConnectEnded);this.desktopConnector1.Disconnected += DesktopConnector1_Disconnected;this.desktopConnector1.BeginConnect(this.ownerID);if (audioEnabled){this.microphoneConnector1.BeginConnect(this.ownerID);}}private void DesktopConnector1_Disconnected(ConnectorDisconnectedType type){if (this.InvokeRequired){this.BeginInvoke(new CbGeneric<ConnectorDisconnectedType>(this.DesktopConnector1_Disconnected), type);}else{if (type == ConnectorDisconnectedType.OwnerActiveDisconnect || type == ConnectorDisconnectedType.GuestActiveDisconnect){return;}MessageBox.Show("断开连接!原因:" + type);this.Close();}}void desktopConnector1_ConnectEnded(ConnectResult result){if (this.InvokeRequired){this.BeginInvoke(new CbGeneric<ConnectResult>(this.desktopConnector1_ConnectEnded), result);}else{if (result != ConnectResult.Succeed){MessageBox.Show("连接失败!" + result.ToString());}    }}

  以下为在PC端远程观看手机屏幕的截图: 

  

2.PC被控端:显示正在被哪些用户观看

  

三.安卓端实现

    安卓客户端就与PC客户端的实现原理差不多了,只是其中一些细节不一样而已

    安卓端同样也是分为2种身份:监控端、被控端

    

  同PC客户端一样我们也要初始化多媒体管理器 来连接服务端进行通信

LogonResponse omcsResp = MultimediaManagerFactory.GetSingleton().initialize(id, password, ipaddStr, 9900, getApplication());//登录OMCS服务器

1.安卓控制端:功能同PC一样,可观看目标用户的屏幕和监听麦克风

  

  这里我们用到了一个自定义组件 DesktopSurfaceView 用来显示对方桌面的图像 ,我们通过桌面连接器 DesktopConnector 去连接对方的桌面将获取的桌面图像数据用于该组件来显示

//显示对方数据view  DesktopSurfaceView otherView = (DesktopSurfaceView) findViewById(R.id.Desk_surface_remote);desktopConnector.setOtherVideoPlayerSurfaceView(otherView);desktopConnector.setConnectorEventListener(new IConnectorEventListener() {@Overridepublic void connectEnded(ConnectResult connectResult) {if( connectResult!= ConnectResult.Succeed){Message msg = Message.obtain(); // 实例化消息对象msg.what = 1; // 消息标识msg.obj = "远程桌面连接失败:" + connectResult.toString(); // 消息内容存放myHandler.sendMessage(msg);}}@Overridepublic void disconnected(ConnectorDisconnectedType connectorDisconnectedType) {if(connectorDisconnectedType==ConnectorDisconnectedType.OwnerActiveDisconnect||connectorDisconnectedType==ConnectorDisconnectedType.GuestActiveDisconnect){return;}Message msg = Message.obtain(); // 实例化消息对象msg.what = 2; // 消息标识msg.obj = "远程桌面连接断开:" + connectorDisconnectedType.toString();// 消息内容存放myHandler.sendMessage(msg);}});desktopConnector.beginConnect(targetUid);

  下图为手机监控PC桌面 

  

2.安卓被控端:需要采集本手机的桌面图像、麦克风声音发送给控制方

  核心点在采集本手机的整个桌面的图像,这一点在OMCS框架中已经为我们处理好了,我们只是需要设置一下相关权限来允许录制屏幕即可,剩下的事情都可以交给omcs内部去处理了。

MultimediaManagerFactory.GetSingleton().setDesktopRecordActivity(this);//this 为当前Activity@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);MultimediaManagerFactory.GetSingleton().setDesktopRecordActivityResult(requestCode, resultCode, data);//设置授权结果给多媒体管理器}

  当控制方请求观看安卓的桌面时,被控端会弹出如下权限申请提示,点击“立即开始”对方就可以开始采集屏幕并将数据发送给 控制方用于显示。(若勾选了始终允许分享屏幕 的选项,之后控制端请求访问该被控端时就不会再次弹出权限的对话框了,可直接看得到该屏幕)

  

四、ScreenMonitor 源码下载

1. 项目源码下载 ScreenMonitor.rar

2. 部署版本下载 ScreenMonitor_Deploy.rar 

另外:开源即时通信 GGTalk V7.0 已于2020.09.30发布,全新的 服务端+PC端+Android端 源码,快来下载吧!

如何实现:手机监控PC桌面?(附源码)相关推荐

  1. java手机象棋软件下载,Java手机网络版象棋游戏附源码JAVA游戏源码下载

    运行于手机上的中国象棋游戏,鉴于JAVA J2ME技术,本游戏分服务端和客户端,导入JAR包即可在手机上运行,内有开发文档和运用说明. Java手机网络版象棋游戏附源码 (1 folders, 2 f ...

  2. java计算机毕业设计ssm基于大数据的汽车流量监控cvej1(附源码、数据库)

    java计算机毕业设计ssm基于大数据的汽车流量监控cvej1(附源码.数据库) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也 ...

  3. JAVA计算机毕业设计无人值守台球厅智能管理监控系统(附源码、数据库)

    JAVA计算机毕业设计无人值守台球厅智能管理监控系统(附源码.数据库) 目运行 环境项配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ E ...

  4. 一套完整版开源的监控系统(附源码)吃透监控系统

    前言 电视监控系统由前端监视设备.传输设备.后端存储.控制及显示设备这五大部分组成.后端设备可进一步分为中心控制设备和中心控制设备.前.后端设备有多种构成方式,它们之间的联系可通过电缆.光纤.微波等多 ...

  5. 吃透监控系统!分享一套开源的监控系统(附源码)

    前言 电视监控系统由前端监视设备.传输设备.后端存储.控制及显示设备这五大部分组成.后端设备可进一步分为中心控制设备和中心控制设备.前.后端设备有多种构成方式,它们之间的联系可通过电缆.光纤.微波等多 ...

  6. SSM+手机销售网站 毕业设计-附源码161043

    ssm手机销售网站的设计与实现 摘 要 近年来,随着移动互联网的快速发展,电子商务越来越受到网民们的欢迎,电子商务对国家经济的发展也起着越来越重要的作用.简单的流程.便捷可靠的支付方式.快捷畅通的物流 ...

  7. 超级好看的登录页面,可以密码和手机验证码页面(附源码)

    学校学生会档案系统需要更新登录界面ui,网上没有找到合适的就自己写了一个,分享出来,图中logo等均学校图标就不做展示 功能介绍 1.有手机验证码登录和密码登录窗口 2.背景刷新一次换一次,也可以隔几 ...

  8. 基于Matlab的激光雷达机场地面监控仿真(附源码)

    目录 一.设置方案 ​编辑 二.设置扩展对象跟踪器和性能衡量指标 2.1 扩展对象跟踪器 2.2 指标 三.运行方案和跟踪器 四.结果 五.总结 六.程序 停机坪是机场的一个特定区域,旨在容纳飞机,用 ...

  9. springboot手机推荐网站 毕业设计-附源码052329

    摘 要 随着社会的发展,计算机的优势和普及使得手机推荐网站的开发成为必需.手机推荐网站主要是借助计算机,通过对首页.手机问答.公告消息.手机资讯.手机测评.我的.跳转到后台等信息进行管理.减少管理员的 ...

  10. 一个很酷的监控系统(附源码)

最新文章

  1. 使用jQuery制作手风琴效果.(转)
  2. linux halt函数,常用Linux命令 reboot halt shutdown passwd vlock exit等
  3. 【面向代码】学习 Deep Learning Convolution Neural Network(CNN)
  4. Linux基础篇之文本、数据流处理命令(sed uniq grep awk wc)
  5. 恶意代码实战Lab13-01分析
  6. 《机器学习》 —— 第二章:模型评估与选择 学习笔记
  7. PAT_B_1086_Java(15分)
  8. 【C语言进阶深度学习记录】五 C语言中变量的属性
  9. 把 mysql 整个加载进内存磁盘中_MySQL 缓冲池 是什么?
  10. JAVA中的isMirror函数_Swift中的反射Mirror
  11. GigaSpaces Grid for dataBase Cashing
  12. 如何通过文件流将很多图片存入SD卡,而不是自己内存
  13. HA模式下的java api访问要点
  14. c++在数组中添加元素_LeetCode 题解 | 1157. 子数组中占绝大多数的元素
  15. 在上海创业的日子之了解银行企业对公基础账户收费情况
  16. [NIPS 2018] Delta Encoder: An Effective Sample Synthesis Method for Few Shot Object Recognition
  17. 新启动计算机顺序,最新版本:计算机启动启动项设置
  18. PTX/CR偶联物胶束/TAT-KLA/阿司匹林偶联/双氢青蒿偶联紫杉醇的制备
  19. 在ubuntu上安装nodebb
  20. html中collapse代码怎么写,CSS 面试题: 手写 collapse(折叠) 的 css/html 部分

热门文章

  1. C3D行为识别(一):UCF101视频数据集预处理
  2. 国内优质海量数据集收集网站
  3. 关于三极管的饱和与截止(失真)
  4. Java EE 常用单词
  5. SpringBoot简明教程
  6. python读取udp数据包内容_python – 解析UDP数据包
  7. 不一样的设计!20个国外优秀的电子商务网站
  8. 《工程电磁场(第三版)》(倪光正 主编)复习
  9. zzuli OJ 1047: 对数表
  10. 将swf转成html5代码,一键把swf转为html5 canvas动画 Fanvas