2010-06-09 52 views
1

我想我需要連接到遠程RMI對象而不通過註冊表,但我不知道如何。連接到沒有註冊表的RMI對象

我的情況是這樣的:我正在實施一個簡單的工作分配服務,它由一名分銷商和多名工人組成。分銷商有一個已註冊的RMI對象,客戶端連接到該對象以發送作業,並且工人連接以接受作業。

不幸的是,分銷商和工人主機在防火牆後面。爲了到達分銷商主機,我通過SSH隧道傳輸兩個端口(一個用於註冊表,一個用於分銷商對象),這樣我就可以從防火牆之外訪問註冊表和分銷商。爲了做到這一點,我必須在分配器JVM上設置「-Djava.rmi.server.hostname = localhost」,以便客戶端連接到本地的隧道端口,而不是實際分發主機上的端口被阻塞。

這對工作人員造成了一個問題,因爲他們需要直接連接到分銷商,但由於「本地主機」重定向,他們的行爲與客戶端類似,並嘗試連接到自己主機上的端口,這是不可用,因爲我沒有對工人進行挖掘(這是不切實際的)。

現在,如果我可以通過提供主機名和端口直接連接到遠程對象,我可以在分發服務器上註冊表和「本地主機」破解,並讓工作人員正確連接。

我該怎麼做?還是有不同的解決方案來解決這個問題?

回答

1

我現在通過實現我自己的連接到「本地主機」而不是分發主機的RMISocketFactory解決了這個問題。通過在客戶端通過RMISocketFactory.setSocketFactory使用這個套接字工廠,我現在可以在沒有任何攻擊的情況下運行分發者和工作者。當然,在客戶端我仍然需要SSH隧道。

+0

保存了我的一天,非常感謝! – ChristophK 2011-09-22 11:06:54