2012-12-23 18 views
0

我想澄清有關網絡OOP。例如,使用客戶端 - 服務器模型,如使者,您有兩個程序。當客戶端程序運行時,它的一個對象被實例化。然後在客戶端程序內實例化Socket,並使用ServerSocketaccept()方法連接到服務器程序ServerSocket。根據在服務器程序中創建新的Socket的文檔。根據我的經驗,任何時候在Java中使用create這個詞時,它指的是一個對象,所以現在有一個客戶端的兩個對象Socket?一個在客戶端程序上,另一個在服務器上?是否有可能通過服務器程序實例化客戶端程序中的某個對象?JavaEE面向對象的網絡

最後,如果我使用static修改的客戶端程序來創建我Socket通常會允許創建只是其中的對象,因此,如果在客戶端程序的SocketSocket通常是不一樣的Socket爲在服務器程序中,引用創建的對象,現在是否只有一個對象在這兩個程序之間共享?

只是爲了清楚我不是在談論多個客戶端連接,我只是想了解客戶端的Socket連接到服務器的ServerSocket的基本機制,以及弄清楚我能做什麼和無法做什麼這種聯繫,但一旦我明白了,我可以在我自己的時間進行實驗。

我希望我不會在想這個。在此先感謝您的幫助 :-)。

+0

我已經刪除了對Java EE的引用,並引發了一些段落中斷。 –

回答

1

首先,您的問題與Java EE沒有任何關係。套接字是Java SE的一部分。

你也不明白static是什麼意思。 static將變量作用於類,而不是將其作用於類的實例。它不限制創建的對象的數量。每個JVM都有自己的對象和類,它們不會與網絡上的任何其他JVM共享。將對象存儲到客戶端JVM中類A的靜態變量foo不會對服務器上存儲的A.foo中的內容產生任何影響。

我不明白你爲什麼如此關心創建的套接字對象的數量。一個套接字就是這樣一個端點,用於雙方之間的通信。每一方都有自己的端點,連接到另一方的端點。有點像給朋友打電話時:你使用手機,而你的朋友也使用手機,並且兩部手機相互連接。

+0

但客戶端程序未連接。每個通過服務器連接,我試圖找出處理客戶端之間通信的最佳位置。 –

1

首先,是的,你完全正確的是最終得到兩個Socket對象用於同一個連接,一個在客戶端程序中,另一個在服務器端。然而,將這些看作是「相同」的對象是錯誤的。在普通的語言中,'socket'是連接插入某物的地方;兩件事物之間的連接有兩個套筒,每一端都有一個套筒。網絡Socket是一樣的 - 你在客戶端程序中有一個,在服務器程序中有一個。

您在服務器程序中也有ServerSocket,但這是完全不同的。這不是一個真正的套接字,它是一個用於製作套接字的設備。在原來的伯克利套接字API中,這被模擬爲一種套接字(錯誤地是這樣),所以它在Java中被相應地命名。

您詢問服務器程序是否可以在客戶端程序中創建對象。您意味着帶套接字的業務是客戶端在服務器程序中創建對象的一個​​示例。這兩種情況都不是這樣。服務器程序中的Socket完全由服務器代碼創建。

現在,有一種叫做serialization的東西,它可以讓你在一個程序中取對象,將它們編碼爲字節,使用套接字通過網絡發送,然後在另一端從這些字節重新構造新的對象。這不允許一個程序遠程操作另一個程序,並且它不會同時創建兩個程序中的對象,但它確實允許兩個協作程序將對象從一個程序複製到另一個程序。

至於static,是的,正如JB所說,你誤解了這一點。如果聲明一個變量static,這意味着它屬於它聲明的類,而不是它聲明的類的實例,所以在該程序中只有一個變量副本,而不是每個類的實例一個。但是,它對程序沒有影響。不同的程序完全分離變量的宇宙,因此每個程序都有自己的static變量副本。

+0

對不起,我覺得我做了一個糟糕的工作描述靜態,例如,如果我在一個類中創建一個列表,然後創建幾個對象,如果它們添加到構造函數中,他們創建該列表將具有相同數量的對象無論我在哪裏提及它,對嗎?並且,謝謝你的評論非常豐富,我知道這不是獲得教育的地方,但也許你可以推薦一本好書嗎? –

+0

我不明白你在說什麼靜態與你的例子;你的句子格式不正確,我無法真正做到這一點。 –

+0

至於要讀的東西,我認爲你需要一個堅實的網絡介紹。您可以查看Java網絡教程中的[All About Sockets](所有關於套接字)(http://docs.oracle.com/javase/tutorial/networking/sockets/index.html)課程。一本好書的Java書的網絡部分也應該這樣做 - 我喜歡[Just Java](http://www.amazon.com/Just-Java%C2%BF-6th-Peter-Linden/dp/0131482114/ )當我讀它時,但那已經是十多年前了! –