2011-03-25 73 views
3

如果我有兩個互相瞭解的客戶端(即他們知道要使用哪個端口及其各自的主機名),它們是否可以使用套接字互相連接?在網絡中連接兩個客戶端

我知道一個可以作爲服務器運行,一個可以作爲客戶端運行,但它們都可以作爲客戶端嗎?兩個客戶端都不在路由器或防火牆之後,每個客戶端都有一個唯一的IP。我正在使用Java,所以我想在兩個客戶端上使用兩個Socket實例,而不是一個ServerSocket,另一個是Socket。

回答

1

有人需要監聽某處的連接。一個標準的Socket連接連接到一個主機和監聽端口(ServerSocket用於標準Java套接字)。默認情況下,ServerSocket會阻塞,等待傳入連接。

如果在兩個客戶端上添加一個ServerSocket連接,您希望有一個線程監聽連接,另一個線程試圖建立一個傳出連接。還有一些替代方法,例如使用NIO,它將允許您檢查傳入和傳出連接而不會阻止整個應用程序。

您也可以看看廣播,但是,該解決方案也存在複雜性。

還有一個想法:根據您的要求,您可以始終考慮利用P2P框架,如JXTA。

1

不,他們只能通過至少在其中一方初始化一個server socket來完成。在其中一個客戶端建立連接之後,您可以實現協議從雙方寫入/讀取。 這是「等待」連接的機制,如果客戶端套接字未首先被服務器套接字初始化,則無法接收連接。

理念,你爲什麼不集成在兩個客戶端小HTTP服務器,讓你知道你能堅持到HTTP協議(即:Jetty

0

不,你需要一個ServerSocket監聽端口並接受連接。

0

簡而言之 - 答案是否定的,您不能將兩端用作客戶端。沒有命令 可讓兩個套接字相互連接。

使用套接字API創建連接的唯一方法是讓一方偵聽連接並接受它們,並讓另一方連接到它。

通常的解決方案是任意決定一端是服務器,另一端是客戶端。 您在服務器端偵聽,並在客戶端連接。

1

您可以創建一個ServerSocket,接受一個連接。與只創建一個套接字相比,這增加了一行代碼,所以它沒有太多的代碼開銷。

在服務器端

ServerSocket ss = new ServerSocket(port); // can be reused. 

Socket s = ss.accept(); 

既然你只需要一個連接客戶端

Socket s = new Socket(hostname, port); 

,它可能沒有任何更復雜,這。

0

如果不關心消息的可靠傳送,則可以使用無連接UDP協議而不是TCP。

TCP是一種面向連接的協議,因此參與者必須在其他人監聽連接時啓動連接。