最近作了一個項目,裏面有涉及到監控PC桌面和監視手機屏幕的功能,客戶須要在PC電腦上和安卓手機上都可以觀看對方的屏幕,而對方的設備既能夠是PC電腦,也能夠是安卓手機。服務器
爲了便於之後複習,我把這個屏幕監控的功能單獨提出來作了個Demo名爲ScreenMonitor來記錄備忘,順便也分享給你們。框架
該Demo一個包括3個項目:服務端、PC客戶端、安卓客戶端。ide
文末除了將ScreenMonitor整個項目的源碼提供下載,也專門給出了能夠直接部署的版本,供你們直接部署測試。測試
接下來,我將給你們介紹整個功能的實現原理和代碼邏輯,你們能夠從文末下載源碼後,對照源碼再來看下面的介紹就會更清晰些。 ui
一.服務端實現
服務端主要用來轉發數據(被監控的屏幕圖像的編碼數據),並不涉及其它複雜的業務邏輯。this
這個實現起來很簡單,只須要幾句代碼就OK,它主要作的就是將客戶端的消息的處理與數據的轉發。這裏不作過多的介紹,其關鍵核心代碼只有一句,就是建立OMCS多媒體服務器實例。 編碼
Program.MultimediaServer = MultimediaServerFactory.CreateMultimediaServer(9900, userVerifier, config, bool.Parse(ConfigurationManager.AppSettings["SecurityLogEnabled"]));
第一個參數是提供服務的TCP端口,第二個參數用於驗證登陸的用戶賬號密碼。服務端運行界面以下所示:spa
二.PC客戶端實現
客戶端中咱們也分爲了2種身份:控制端、被控端3d
咱們在登陸時,咱們須要初始化多媒體管理器 來鏈接服務端進行通訊,其實也很簡單,咱們也只須要調用一句話就OK。 orm
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 去鏈接對方的桌面將獲取的桌面圖像數據用於該組件來顯示 鄭州哪裏割包皮好http://www.zztongji120.com/
//顯示對方數據view DesktopSurfaceView otherView = (DesktopSurfaceView) findViewById(R.id.Desk_surface_remote); desktopConnector.setOtherVideoPlayerSurfaceView(otherView); desktopConnector.setConnectorEventListener(new IConnectorEventListener() { @Override public void connectEnded(ConnectResult connectResult) { if( connectResult!= ConnectResult.Succeed){ Message msg = Message.obtain(); // 實例化消息對象 msg.what = 1; // 消息標識 msg.obj = "遠程桌面鏈接失敗:" + connectResult.toString(); // 消息內容存放 myHandler.sendMessage(msg); } } @Override public 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桌面
鄭州作包皮手術多少錢http://www.zztjxb.com/
2.安卓被控端:須要採集本手機的桌面圖像、麥克風聲音發送給控制方
核心點在採集本手機的整個桌面的圖像,這一點在OMCS框架中已經爲咱們處理好了,咱們只是須要設置一下相關權限來容許錄製屏幕便可,剩下的事情均可以交給omcs內部去處理了。
MultimediaManagerFactory.GetSingleton().setDesktopRecordActivity(this);//this 爲當前Activity @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); MultimediaManagerFactory.GetSingleton().setDesktopRecordActivityResult(requestCode, resultCode, data);//設置受權結果給多媒體管理器 }
當控制方請求觀看安卓的桌面時,被控端會彈出以下權限申請提示,點擊「當即開始」對方就能夠開始採集屏幕並將數據發送給 控制方用於顯示。(若勾選了始終容許分享屏幕 的選項,以後控制端請求訪問該被控端時就不會再次彈出權限的對話框了,可直接看獲得該屏幕)