用java实现我自己的远程桌面
Posted
技术标签:
【中文标题】用java实现我自己的远程桌面【英文标题】:Implementing my own remote desktop in java 【发布时间】:2011-07-02 02:37:29 【问题描述】:我正在尝试用 java 实现我自己的远程桌面解决方案。使用套接字和 TCP/UDP。 我知道我可以使用 VNC 或其他任何东西,但这是我想做的学校作业。
因此,对于移动鼠标和单击,我可以使用 Robot 类。我对此有两个问题:
发送视频怎么样?我知道 Robot 类也可以捕获屏幕,所以我应该按顺序发送图像并在连接的另一端按顺序显示吗?这是实现远程桌面的最佳方式吗?
我还应该使用 TCP 还是 UDP? 我认为 UDP 将更难实现,因为我必须弄清楚哪个图像在另一个之后。
【问题讨论】:
@codymanix 和@unwind 有一些优点。只是为了补充它,如果您确实需要一些参考,请查看 jrdesktop.sourceforge.net 。它是一个基于 Java RMI 的解决方案。但首先尝试自己编写。祝你好运。 【参考方案1】:您正在尝试做的事情会奏效,但速度非常慢。图片在通过网络发送之前必须压缩。在压缩之前,应该减少颜色数量。此外,仅应发送自上次更新以来已更改的图像部分。
在传输鼠标坐标时,仅当新鼠标位置距离上一个位置超过 x 像素或超过 y 秒时,才会发生更新。否则,您会为鼠标位置花费太多流量,以至于没有空间放置图像。
UDP 将是这里的最佳解决方案,因为它对于视频流传输是最快的(这正是您正在做的事情)。
【讨论】:
【参考方案2】:大约2:
UDP 会更难,因为它是基于数据报的协议,一次可以发送多少数据是有限制的;您不太可能将整个图像放入单个数据报中。因此,您将不得不处理差异/部分更新,这很快就会变得复杂。
然而,TCP 是基于流的,仅按顺序传送数据。如果中间的一个数据包消失了,需要重新发送,所有后续的数据包都需要等待,即使它们已经被目标机器接收到。这会产生延迟,这在交互式应用程序中通常是非常不受欢迎的。
因此 UDP 可能是您的最佳选择,但您不能围绕可以一次发送整个图像的假设来设计它,您需要想出一种方法来仅发送部分图像。
【讨论】:
【参考方案3】:基本上,视频是按秒显示的一系列图像(帧)。您应该发送尽可能多的带宽。
另一方面,发送原始图像是没有意义的,你应该尽可能地压缩它,并且一定要考虑在这个过程中损失很多分辨率。
你可以看看这个SO question about image compression,如果你把它压缩得足够,你可能会有一个生动的视频。
【讨论】:
【参考方案4】:如果您使用 Google Protocol buffer 或 Apache thrift 会更好。您将发送更小的二进制数据 - 这样,您的软件将运行得更快。
【讨论】:
以上是关于用java实现我自己的远程桌面的主要内容,如果未能解决你的问题,请参考以下文章