![](/img/trans.png)
[英]Why Java ServerSocket accept() returns a socket with the same port as ServerSocket?
[英]Java the difference of Socket and ServerSocket in using port
在服務器端,我們使用
Socket server = serverSocket.accept();
創建一個套接字。 創建套接字后,我們可以創建一個新線程來處理該套接字的輸入/輸出流。 因此,如果有進一步的連接請求,我們可以回到同一端口監聽並創建新套接字。由於我們已經在特定端口創建了ServerSocket,當然我們無法再在該端口創建另一個ServerSocket。
所以根據我的理解,我可以得出結論,在服務器端,我們可以在一個端口下創建多個套接字嗎? (類似於Web服務器的功能)
實際上我的問題是,在客戶端,當我們創建套接字時,我們可以指定我們想要使用的本地端口。 在我們成功在該本地端口創建客戶端套接字后,我們可以將該端口重用於其他客戶端套接字嗎? 在套接字關閉(或端口關閉)之前,該端口是否會永久綁定到套接字? 由於客戶端沒有“Listening”概念,我們是否能夠像ServerSocket那樣做(參考ServerSocket可以在一個端口下創建多個套接字)?
我很困惑客戶端如何處理端口和套接字,因為我正在比較ServerSocket和客戶端套接字。
請指出正確的方向,我知道我的想法有些不對勁。 非常感謝。
ServerSocket
可以簡單地看作是傳入連接的Socket
工廠。 對於每個傳入的客戶端連接, ServerSocket.accept()
方法返回一個新的Socket
以與該客戶端進行通信,並且僅與該客戶端進行通信。
換句話說,可以對單個ServerSocket
進行任意數量的連接(僅受OS限制),並且每個客戶端連接將獲得單獨的Socket
進行通信,所有連接都使用相同的服務器端TCP端口進行通信。
所以根據我的理解,我可以得出結論,在服務器端,我們可以在一個端口下創建多個套接字嗎? (類似於Web服務器的功能)
你的術語令人困惑。 ServerSocket.accept()
接受 連接,並將端點包裝在Socket
。 根據RFC 793的定義,端點具有與ServerSocket
相同的本地端口號,因此包裝Socket
。
實際上我的問題是,在客戶端,當我們創建套接字時,我們可以指定我們想要使用的本地端口。
我們可以,但我們很少這樣做。
在我們成功在該本地端口創建客戶端套接字后,我們可以將該端口重用於其他客戶端套接字嗎?
沒有。
在套接字關閉(或端口關閉)之前,該端口是否會永久綁定到套接字?
是的,或者反過來說:套接字綁定到端口。
由於客戶端沒有“Listening”概念,我們是否能夠像ServerSocket那樣做(參考ServerSocket可以在一個端口下創建多個套接字)?
沒有。
您應該將套接字想象為兩對信息數組:
因此,單個服務器可能有許多連接到它的{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
希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.