Implementing my own remote desktop in java
我正在尝试用Java实现我自己的远程桌面解决方案。使用套接字和TCP/UDP。我知道我可以使用VNC或其他任何工具,但这是我想做的学校作业。
所以为了移动鼠标和点击,我可以使用机器人类。关于这一点,我有两个问题:
发送视频怎么样?我知道机器人类也可以捕获屏幕,所以我应该按顺序发送图像并在连接的另一端按顺序显示吗?这是实现远程桌面的最佳方法吗?
我还应该使用TCP还是UDP?我认为UDP会更难实现,因为我必须找出哪个映像排在另一个映像之后。
你想做的事情会奏效,但速度非常慢。在通过网络发送图像之前,必须对其进行压缩。在压缩之前,应该减少颜色的数量。此外,只应发送自上次更新以来已更改的图像部分。
当传输鼠标坐标时,只有当新的鼠标位置距离最后一个位置超过x像素或超过y秒时,才会进行更新。否则,鼠标位置会占用大量的流量,因此没有空间放置图像。
在这里,UDP将是最好的解决方案,因为它是视频流最快的解决方案(这是您有效地做的)。
大约2:
因为它是一个基于数据报的协议,一次可以发送的数据量是有限制的;你不太可能将整个图像放在单个数据报中。因此,您必须处理差异/部分更新,这很快就会变得复杂起来。
然而,TCP是基于流的,只按顺序传递数据。如果中间的一个包消失了,需要重新发送,那么所有下面的包都需要等待,即使它们已经被目标机器接收到。这会造成滞后,这在交互式应用程序中通常是不可取的。
因此,udp可能是您的最佳选择,但您不能围绕一次可以发送整个图像的假设进行设计,您需要想出一种方法来只发送部分图像。
基本上,视频是以秒为单位显示的一系列图像(帧)。你应该发送尽可能多的带宽。
另一方面,没有必要发送原始图像,你应该尽可能地压缩它,并且在这个过程中肯定会考虑丢失很多分辨率。
你可以看看这个,所以关于图像压缩的问题,如果你足够压缩它,你可能会有一个生动的视频。
如果您使用Google协议缓冲区或ApacheThrift,会更好。您将发送更小的二进制数据-通过这个,您的软件将更快地工作。