2016-02-14 78 views
0

爲什麼我們必須創建一個InetSocketAddress的對象?爲什麼我們必須使用InetSocketAddress來輸入我們的端口號才能使用ServerSocketChannel

ServerSocket我們只是用int輸入端口號

例子:

try(
    ServerSocketChannel listener = ServerSocketChannel.open(); 
    ServerSocket serverSocket = listener.socket() 
    ){ 

     serverSocket.bind(new InetSocketAddress(2266)); 
     //we can't use serverSocket.bind(2266); 

    }catch (IOException e){ 

     e.printStackTrace(); 
    } 
+1

我試圖正確地閱讀這個問題。你的一個說法是「我們只是使用'int'來輸入端口號」,但是在你的代碼中你不只是使用'int',而是你使用'InetSocketAddress'並聲明「我們不能使用'int'來輸入端口號「。這個問題本身似乎有矛盾。 –

+0

我們不能使用'serverSocket.bind(2266)',我們必須通過'new InetSocketAddress(2266)'來包裝這個端口號,或者換句話說把這個端口號放在'new InetSocketAddress()'構造函數裏面。 – James

+0

爲什麼我們必須使用InetSocketAddress?爲什麼我們不能像我們想要創建一個簡單的SocketServer那樣把我們的號碼放在那裏? – James

回答

2

你的問題是有些不清楚。

ServerSocket#bind()建立連接的當地結束。如果您的系統具有多個網絡適配器和/或多個IP地址,並且您希望使用特定的本地適配器或IP地址連接套接字,那麼您應提供一個完整的InetSocketAddress(host,port)以及主機和端口,其中主機部分是您的本地IP地址之一。

在默認情況下,您只有一個IP地址,或者有多個IP地址但不關心哪一個用作源,您可以省略主機並只指定端口,如示例中所示。

API是這樣定義的。 TCP連接是對稱的,並由其兩個端點定義。端點是一對(主機,端口)。這適用於連接的兩端。因此bind()調用需要InetSocketAddress參數。爲方便起見,InetSocketAddress將假定默認主機指定「使用任何可用接口」,如果您只提供一個端口。

的API設計可能添加了一個bind(int port)方法來構建幕後InetSocketAddress(port),但顯然並沒有覺得這是必要的。

+0

這部分: 'API是這樣定義的。它需要一個InetSocketAddress參數,並且該參數可以只包含端口或完整的主機/端口'我的問題是爲什麼API以這種方式定義......而不僅僅是像SocketServer那樣獲得普通的'int'(端口) – James

+0

@詹姆斯這句話的第二部分回答你的問題。InetSocketAddress包含的不僅僅是端口。如果僅指定端口,則其他屬性將設置爲其默認值。該API非常簡單,你沒有理由抱怨。 –

+1

@詹姆斯我更新了我的答案。如果你仍然想知道爲什麼你必須接受API的設計者。 –

0

的InetSocketAddress創建一個套接字地址,其中IP地址是通配符地址和端口號的指定值

通配符是可用於結合特殊的IP地址。如果你不想聽「一切」,但可能是特殊的IP地址,比如5.5.5.5,那麼你將被綁定到該IP地址,而不是其他IP地址。

但是,如果沒有IP部分,它意味着任何IP都將被監聽,因此對於此特定用法幾乎沒有區別。

相關問題