2012-08-10 147 views
3

這是一個普通套接字問題。在Java中,如果我有一個ServerSocket綁定到特定的端口,比如說4444,我知道它正在監聽連接請求。 accept()方法阻塞,直到收到連接請求,並返回一個新的Socket與客戶端進行通信。返回的Socket的遠程端點是客戶端的IP地址和端口。由ServerSocket.accept返回的Java客戶端套接字()

但是,我感到困惑的是返回的Socket的本地端口與正在偵聽請求的ServerSocket的端口號相同(在本例中爲4444)。我認爲兩個套接字不能綁定到同一個端口?返回的Socket是不是服務器上的不同端口?

回答

6

兩個ServerSocket不能偵聽相同的IP地址和端口。它可能有兩個ServerSockets監聽不同的IP和相同的端口。

兩個套接字不能具有相同的IP和本地AND遠程端口。本地端口可以爲許多套接字提供相同的遠程IP端口&是不同的。

+0

我明白了。所以,從理論上講,如果我是一個客戶端連接到2個帶有2個套接字的不同服務器,那麼只要端點不同,臨時端口(由系統分配)可以是相同的?我不可能真的看到這種情況發生,但理論上它可以起作用嗎? – Pattay 2012-08-10 16:49:43

+0

我相信如此,但我從來沒有見過這種。 – 2012-08-10 20:52:40

+0

你不會在出站連接上看到它,因爲bind()在內核中的connect()之前(即使是隱式的),並且在執行時不知道連接目標,所以在給定時必須找到一個空閒的本地端口號零端口號。 – EJP 2012-08-11 02:24:25

0

對於給定IP:端口組合,您不能使用多個套接字監聽,但可以存在多個接受同一組合的連接。

連接由本地IP地址和端口以及遠程IP地址和端口的組合標識。

相關問題