使用 Javascript、Python 和 WebRTC 构建远程桌面应用程序

本文分享使用 Javascript、Python 和 WebRTC 构建远程桌面应用程序。

要开发远程桌面应用程序,我们需要Electron,在“Electron”的帮助下,可以使用 Javascript 构建我们的应用程序。Python 用于执行从客户端接收到的鼠标和键盘事件,这里将使用PyAutoGui库来执行事件。为了在 Electron 和 Python 之间建立通信,我们将使用“ WebSockets ”库创建一个本地服务器,用于在 Electron (Javascript) 和 Python 之间传输数据。

这个远程桌面应用程序如何运行?

使用 Javascript、Python 和 WebRTC 构建远程桌面应用程序
远程桌面客户端和服务器概念图

我们要构建的远程桌面应用程序完全基于“WebRTC”。它是一种实时通信技术,可用于在两个客户端之间建立点对点通信。通过使用“WebRTC”,我们可以直接从浏览器传输音频和视频,并且我们还可以使用“ Screen Share API”共享计算机屏幕。

要实现这个项目,我们需要构建三个主要部分,它们是信令服务器、屏幕共享应用程序和客户端Web应用程序。

信令服务器

步骤 1:构建信令服务器是我们项目的第一步。该服务器只需要在两个客户端之间建立 WebRTC 连接。在我们的案例中,这将是屏幕共享应用程序和客户端 Web 应用程序。

屏幕共享应用程序

第 2 步:使用 Electron 和 Python,我们将创建一个屏幕共享应用程序,它将向客户端传输实时屏幕,同时接收客户端的键盘和鼠标事件,并在同一(主机或远程)系统上执行。

客户端Web应用程序

第 3 步:这是项目的最后一步,在这一阶段,我们将创建一个客户端Web应用程序,该程序将接收来自远程计算机的实时屏幕,我们还可以通过该Web应用程序控制远程计算机。

我们要做什么?

创建一个简单的网页,在浏览器上共享屏幕,其中我们将整合鼠标点击事件,该事件将从浏览器获取,并使用 “Python “在桌面上执行。

注:基本上,屏幕共享 API 只允许我们共享屏幕及其音频。它不提供控制功能,如鼠标移动或点击事件。因此,我们将手动添加控制功能。

使用 Javascript、Python 和 WebRTC 构建远程桌面应用程序

要求

  • Python 3.4 以上版本
  • HTML & JavaScript

Python 库

  • PyAutoGui
  • websockets

开始编码

第 1 步:使用 Share Screen Share API 创建客户端网页

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./app.js"></script>
    <link href="./style.css" rel="stylesheet">
</head>
<body>
    <video id="vid" 
    autoplay 
    onclick="pointer(event)" 
    width="1920" height="1080">
</video>
</body>
</html>

style.css

body {
    display: flex;
    justify-content: center;
}

app.js

/* code to connect with websocket server */
const socket = new WebSocket('ws://localhost:5000')
/* code to get screen display */
navigator.mediaDevices.getDisplayMedia({video: true, audio: true})
.then(stream => {
    // inject stream object as a source for video element //
    document.getElementById('vid').srcObject = stream
    document.getElementById('vid').play
    // inject stream object as a source for video element //
})
.catch(e => console.log(e))
/* The below function send the mouse coordinates to the server */
function pointer(e) {
    let posX = document.getElementById('vid').offsetLeft
    let posY = document.getElementById('vid').offsetTop
    let X = e.pageX - posX
    let Y = e.pageY - posY
    let pointer = X.toString() + ',' + Y.toString()
    console.log(pointer)
    socket.send(pointer)
}

注意:上面的 JavaScript 代码将充当客户端,它将鼠标坐标(单击事件)发送到服务器。

第 2 步:使用 Python 创建一个 websocket 服务器,在桌面上执行鼠标移动操作

implementer.py

import asyncio      # importing asyncio library #
import websockets   # importing websocket library #
import pyautogui    # importing pyautogui library #
# Asynchronous function receive the message from client #
async def handler(websocket, path):
    async for message in websocket:
        try:
            pointer = message.split(',')
            pyautogui.moveTo(int(pointer[0]), int(pointer[1]))
            print('X : ', pointer[0])
            print('Y : ', pointer[1])
        except:
            pass
# Iinitating the server #
start_server = websockets.serve(handler, "localhost", 5000)
# Run's the server continuously #
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

注:在上述 python 程序中,我们接收的是字符串形式的坐标,而不是对象形式的坐标,并通过将 “comma “作为参数来分割坐标。以 “string”格式发送和接收坐标是有原因的。因为在本示例中,我们使用 websockets 集成了鼠标点击事件功能,但今后将使用 “WebRTC “而不是 websockets 或 socket.io 在两台不同的计算机之间建立远程连接,因此使用 WebRTC 传输对象可能无法正常工作。因此,我们以字符串的形式传输坐标。

使用 Javascript、Python 和 WebRTC 构建远程桌面应用程序

如何运行?

我们需要先执行 python 脚本,它将等待客户端连接,然后运行网页。网页加载到浏览器后,会要求我们选择要共享的窗口。点击窗口后,它将开始共享屏幕,同时建立 websocket 连接。

使用 Javascript、Python 和 WebRTC 构建远程桌面应用程序
选择窗口
使用 Javascript、Python 和 WebRTC 构建远程桌面应用程序
浏览器缩小到 50%

注意:我们需要将浏览器缩放至 50%。因为我们指定的视频尺寸为 1920 x 1080,所以默认情况下网页的尺寸会很大,因此我们需要使用浏览器缩放选项调整其大小。

放大到 50%后,你将在浏览器上看到你的屏幕。现在,如果你点击视频元素上的任意位置,光标就会自动移动到主桌面上的该位置。

就是这样……完成。

最后,我们为 Screen Share API 添加了鼠标点击功能。

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论