2011-05-22 98 views
2

我已经写了一个Java服务器,允许连接到它的客户端控制计算机的鼠标和键盘。要做到这一点,它使用java.awt.Robot类。我可以在守护进程中使用java.awt.Robot吗?

我需要这台服务器在后台运行并自动启动。我正在解决这个问题的第一个操作系统是基于Debian的(Ubuntu 11.04),而守护进程似乎是一个明显的选择。问题是,当启动期间或安装我的Debian软件包(它的postinst脚本开始使用/etc/init.d/pc-remote-server start它)我得到这个错误时启动守护程序:

java.awt.AWTException: headless environment 
    at java.awt.Robot.<init>(Robot.java:97) 
    at com.se.pcremote.server.CommandExecuter.<init>(CommandExecuter.java:72) 
    at com.se.pcremote.server.PCRemoteServer.<init>(PCRemoteServer.java:215) 
    at com.se.pcremote.server.PCRemoteServer.main(PCRemoteServer.java:122) 

有什么办法,我可以使用java.awt.Robot类从守护进程内?我可以从不是“无头环境”的守护进程产生一个辅助进程吗?或者,有没有更好的方式让我获得像这样没有这种限制的结果的“服务”?

回答

1

好吧,做一些更多的研究和尝试这里的一些更多的选择是什么,我想出了后:

我可以使用java.awt.Robot中从守护进程中?

在我的问题再往下,我阐述了一点:

有什么办法,我可以使用java.awt.Robot中的类从一个守护进程中?否如上。

我能产卵从守护进程是不是一个“无头环境”次级过程?不是我能弄明白。无论如何,如果我真的这么做了,那将会是很多工作。

还是对我有一个更好的方式来获得一个“服务”一样,没有这个限制,结果呢?是的!使用桌面环境!在我使用Ubuntu的情况下,桌面环境是Gnome。 Gnome有一个启动应用程序功能,该功能在全局和每个用户的基础上运行.desktop文件,如here所述。他们还提供有关这些.desktop文件here的结构的信息。我将一个.desktop文件添加到运行我的Java'服务'的/etc/xdg/autostart(全局自动启动文件夹),它的工作原理类似于一种享受。

1

“无头”意味着此代码需要访问图形环境,而不是。

可以在无头的模式,通过提供系统属性,它提供了一个原油实现这给刚刚运行应用程序的基本运行,但其中最有可能无法支持机器人。首先尝试一下。

如果你不能这样做,你需要一个适合你的过程的图形环境。通常的做法是运行VNC X服务器,因为它不需要物理硬件,然后连接到它。

+0

测试设置/未设置DISPLAY =:0.0和设置java.awt.headless = true或java.awt.headless = false的组合后,我认为我已经确定:1)当不是'DISPLAY'环境变量,Java进入无头模式。 2)如果你手动设置一个,它会使Java陷入**而不是**进入无头模式。 3)您可以设置'java.awt.headless'来覆盖开始时决定的任何Java。 4)如果你试图欺骗Java,它只会崩溃而不是优雅地抛出一个异常。 – 2011-05-23 08:16:22

+0

我现在要去查看这个VNC业务。 – 2011-05-23 08:17:44

+0

我已经想出了如何使用x11vnc启动一个VNC服务器,并使用tightvnc启动一个客户端,但是打开一个窗口显示您想要控制的屏幕(如您所期望的那样)。有没有办法打开窗口连接,然后在该环境中运行shell命令? – 2011-05-23 09:48:08

1

我认为,必须正确设置DISPLAY变量(在当机器人过程开始的时间机器人过程的环境)这个工作 - 在你的情况,你需要在指定展示您的在程序启动后一段时间创建的DISPLAY变量。 -

不知道这是否真的起作用,但你可以试一试,并在这里报告它是否有效。

+0

我刚刚尝试在启动之前设置并导出deamon脚本中的DISPLAY环境变量。当服务器启动时,我从Java内部打印了所有包含DISPLAY =:0.0的环境变量,但它看起来像试图实例化Robot时没有发生异常(没有例外)。我从来没有在var/log/daemon.log中看到任何东西 – 2011-05-23 07:58:00