2011-06-07 40 views
0

如果您想使用RMI的自定義套接字(例如,使用SSL),則在UnicastRemoteObject.exportObject(4)中,您需要指定客戶套接字工廠以及服務器套接字工廠。但是,對象的導出是在服務器端完成的。爲什麼客戶端套接字工廠是必需的?RMI exportObject中的客戶端套接字工廠?

除非...它被序列化並被客戶端用來獲取與該對象的連接?我覺得不太可能(儘管這可能是答案); (SSL)Socket工廠聽起來不像可序列化對象的典型例子,密鑰庫是本地的,以及類似的東西。

回答

1

是的,就像你在問題中已經說過:

的RMIClientSocketFactory的必須是可序列化,並與exportObject或UnicastRemoteObject類的構造函數使用時被序列化到客戶那邊

這意味着它不得包含對非序列化對象的引用(非瞬態),只有在運行中創建套接字所需的信息。

(我最近發佈an example for a RMISocketFactory,在這裏我需要照顧到可序列化。)


編輯(從EJP評論後):

當然,這僅適用如果您需要在所有處使用客戶端套接字工廠。在許多情況下,您只需使用其他exportObject方法(或其他構造函數),然後使用服務器端的默認服務器套接字工廠以及客戶端的默認客戶端套接字工廠,而無需序列化任何內容。

是的,將服務器的信任存儲序列化到客戶端沒有意義 - 如果客戶端必須信任註冊表或其他證書可以接受的遠程對象,那麼我們可以指定一個man-in-the中級攻擊。因此SslRMIClientSocketFactory雖然是Serializable,但不會序列化服務器的SSL上下文,而只是使用客戶端VM的SSL設置。

+0

沒有解決問題中的根本謬誤。 – EJP 2011-06-08 11:24:13

+0

當然,如果您需要專門的套接字(例如通過防火牆),則只需要客戶端套接字工廠。但是,如果我理解正確,除了使用'RMISocketFactory.setSocketFactory()'在客戶機上設置虛擬機範圍之外,沒有其他設置工廠的方式。 – 2011-06-08 12:00:42

+0

同意。 OP實際上在這裏詢問什麼還很不清楚。 – EJP 2011-06-08 13:03:15

-1

在 UnicastRemoteObject.exportObject中(...) 你需要指定一個客戶端套接字 工廠以及服務器套接字 工廠(如果你使用自定義 插座可言,當然)。

只有當您使用exportObject()的重載,並且即使這樣您也可以提供null。還有另一個超載,你只需要指定端口號。

這是爲什麼?

不是。

對象的導出是在服務器端完成的。

正確。

爲什麼客戶端套接字工廠是必需的?

不是。

+0

我知道還有其他重載。這就是爲什麼我會說「如果你使用自定義套接字,當然」。 – 2011-06-08 12:03:04

+0

@Bart van Heukelom你說過,我再次引用,你需要指定一個客戶套接字工廠。你沒有。也許你需要改寫你的問題,而不是用自己的話來爭論。 – EJP 2011-06-08 13:01:39

+1

我*需要*使用自定義套接字(SSL),所以我*需要*指定一個套接字工廠,否則使用默認的套接字工廠。你低估了另一個答案,因爲它「沒有解決問題中的根本謬誤」。嗯,我低估了你的意思,因爲它只能指出你在這個問題中所看到的「謬誤」,並且在不必要的長時間內「你在第一句話後說的所有內容都是錯誤的」這種方式,而不是實際上回答它。如果你覺得有什麼需要指出的話,請對這個問題進行評論。 – 2011-06-08 13:14:11