使用Python进行P2P RDP
我想用Python写一个简单的点对点远程桌面客户端和服务器。这是我大致的构思。
- 定时截屏
- 压缩这些截图并发送到服务器应用
- 从服务器应用获取键盘和鼠标事件。把这些事件序列化后发送给客户端。客户端会反序列化这些事件,并用SendInput调用来执行这些操作
我想知道的是:
- Python中有没有现成的远程桌面库可以让我工作更简单?
- 如何用Python从服务器操作员那里获取键盘或鼠标事件?
- 事件序列化最简单的方法是什么?
- 我如何测量鼠标事件的相对X、Y坐标?
- 你能提供一个简单易懂的例子吗?
- 最后我听说如果两个平台都使用微软的操作系统,使用.NET会更简单,这是真的吗?
我的客户端应用将在Windows XP、Vista、7上运行,而服务器应用将在Windows/Linux上运行。如果我遗漏了什么,请告诉我。
3 个回答
根据这个GitHub上的评论,你可以在Python中通过ctypes
来使用libfreerdp
。
可以查看:GitHub上的FreeRDP库。
FreeRDP是一个免费的远程桌面协议库和客户端,详细信息可以访问http://www.freerdp.com/
除了“在Python中”这个说法,听起来你只是想重新发明一个VNC。现在大多数现代版本都是基于TightVNC,而且它是开源的。如果你能理解VNC的代码(用C++写的)和它使用的RFB协议,你会发现你的问题都有答案。
这个Python实现的VNC客户端可能也会对你有帮助。不过,注意那页面上的评论:
这个有什么用?没什么 ;-) 用原版的VNC查看器会有更好的性能。
也许你可以通过某种方式重用VNC技术来实现你的目标?(比如为VNC的C++代码创建Python绑定,或者使用RFB协议,这样你就可以和现有的VNC服务器/客户端互通?)
之前我写了一个叫做 easyrfb 的东西,它也是基于 python-vnc-viewer,但我从来没有发布过。虽然它不完全符合你问的内容,但非常相似。希望它能对你有帮助,部分内容现在可以在 http://hydra.geht.net/easyrfb/ 找到。
请注意,那里的文件并不总是能正常工作,因为这些文件直接链接到我的工作副本。不过我不常编辑。
现在它也可以在GitHub上找到: https://github.com/hilbix/pyrfb/tree/easyrfb
这是我这边的功能:
- 连接到本地运行的Xvnc(其实任何VNC服务器都可以)
- 持续将当前屏幕内容写入一个高度压缩的test.jpg文件
- 一些网页抓取,使用AJAX更新图像
- 在图像上的鼠标点击会转发到VNC服务器作为鼠标点击
- 可以通过表单模拟键盘输入
- 可以进行无损的PNG截图
- 有一个edit.html可以根据PNG截图(称为模板)进行模糊匹配
- Shell脚本可以检查这些模板是否匹配,或者等待它们匹配。
内部通信是通过TCP、Unix-Sockets和一些文件完成的,所以更改它使每个组件在不同位置运行并不困难:
- VNC服务器(要显示的屏幕)
rfbimg.py
(将VNC转换为图像并提供控制.sock
)- Shell脚本(如果需要,使用
sendsock.py
与.sock
通信) - 网络服务(
AJAX
和GET
图像)与存根(将命令转发到.sock
) - 控制的网页客户端(任何浏览器,甚至
lynx
或telnet
都可以)
请不要问我关于文档的事! 用源代码吧,朋友!
心理健康警告! 整个项目就像是一堆复杂的脚本,名字误导且杂乱无章,很多部分没有注释,未完成的半成品,所有东西都硬编码到一台机器上,可能还需要一些十年前的本地调整,或者更老的东西。所以我不会把所有东西都交出来。(即使这听起来很熟悉,不,我不是在为微软工作。)