2011-05-22 88 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