2013-07-18 82 views
4

在服務器端的區別,我們用Java Socket技術和ServerSocket的使用端口

Socket server = serverSocket.accept(); 

創建套接字。創建套接字後,我們可以創建一個新線程來處理該套接字的輸入/輸出流。因此,如果有更多的連接請求進入,我們可以回到偵聽同一端口並創建新套接字。由於我們已經在特定端口創建了ServerSocket,當然我們無法再在該端口再創建一個ServerSocket。

所以從我的理解,我可以得出結論:在服務器端,我們可以在一個端口下創建多個套接字? (類似於什麼Web服務器)

其實我的問題是,在客戶端,當我們創建一個套接字時,我們可以指定我們想要使用的本地端口。在本地端口成功創建客戶端套接字後,我們是否可以將該端口用於其他客戶端套接字?該端口是否會永久綁定到套接字,直到套接字關閉(或端口關閉)?由於客戶端沒有「Listening」概念,我們是否可以像ServerSocket一樣執行相同的操作(請參閱ServerSocket可以在一個端口下創建多個套接字)?

我非常困惑客戶端如何處理端口和套接字,因爲我正在比較ServerSocket和客戶端套接字。

請指點我正確的方向,我知道我的想法有點不對。非常感謝。

回答

3

所以從我的理解,我可以得出結論:在服務器端,我們可以在一個端口下創建多個套接字? (類似於什麼網頁服務器)

你用自己的術語混淆了自己。 ServerSocket.accept()接受 a 連接,並將端點包裝在Socket中。端點具有與ServerSocket相同的本地端口號,根據定義,根據RFC 793,因此包裝Socket也是如此。

其實我的問題是,在客戶端,當我們創建一個套接字時,我們可以指定我們想要使用的本地端口。

我們可以,但我們很少這樣做。

當我們在該本地端口上成功創建了一個客戶端套接字後,我們可以將該端口重新用於其他客戶端套接字嗎?

No.

是否該端口永久綁定到套接字,直到套接字關閉(或端口關閉)?

是的,或者更確切地說:套接字綁定到端口。

由於沒有「聽」的概念在客戶端,是我們能夠做到的ServerSocket的不(指的ServerSocket可以在一個端口創建多個插座)是一回事嗎?

+0

嗨,我想我幾乎可以得到它。我剛剛意識到要形成我們需要的獨特(local_address,LOCAL_PORT,REMOTE_ADDRESS,REMOTE_PORT)對有效的套接字。假設我在端口400創建了一個客戶端套接字,並連接到IP 123.在此連接終止之前,我在同一個端口創建了另一個客戶端套接字400,並將其連接到IP 456.將創建第二個客戶端套接字被接受? – GMsoF

+0

對於TCP/IP,沒有。一次只能有一個應用程序在單個端口上偵聽。現在,如果您有兩塊網卡,則可以讓一個應用程序使用相同的端口號偵聽第一個IP和第二個IP上的第二個IP。一個有效的示例可能會有兩個客戶端在ip 123.0.0.1上通過端口4000和4001同時連接到端口80上的服務器ip 123.0.0.2。兩者都連接到服務器上的80,但客戶端端口的區別在於區分連接。 對於UDP(多點傳送),多個應用程序可以訂閱相同的端口,但是那是一個不同的故事 – sunrize920

+1

你不能「創建在[即其他客戶端套接字綁定到]相同的端口「。理論上,RFC允許它,如果它要連接到不同的目標,但在實踐中的bind()之前連接(),所以內核不會允許它。 – EJP

3

對於傳入連接,A ServerSocket可以簡單地看作Socket工廠。對於每個傳入的客戶端連接,ServerSocket.accept()方法會返回一個新的Socket與該客戶端進行通信,並且僅與該客戶端進行通信。

換句話說,任何數量的連接(僅由OS限制),可向所述單個ServerSocket,以及每個客戶端連接將得到的單獨Socket上進行通信,所有通信使用相同的服務器側的TCP端口。

+0

您好,我想我幾乎得到它。我只是意識到要形成一個有效的套接字,我們需要唯一的(local_address,local_port,remote_address,remote_port)對。所以我們可以說,我在創建端口400的客戶機套接字,並連接到IP 123就此結束之前,我在創作這400相同端口的另一端插座,並將其連接到IP 456請問創建第二個客戶端套接字被接受? – GMsoF

1

你應該想象一個插座作爲信息的兩對數組:

  • {自港,自地址}
  • {目標端口,目標地址}

因此,單個服務器可能有多個連接到它的連接,它們的不同之處在於它們的{Dest Port,Dest Addr}

example: Server port 10000 addr 10.0.0.1 

Socket 1: 

- {10000,10.0.0.1} 
- {10001,10.0.0.2} 

Socket 2: 

- {10000,10.0.0.1} 
- {10002,10.0.0.1} - address may seem the same but as a whole its a 
    different destination 

希望這會有所幫助。