簡體   English   中英

Java在使用端口時Socket和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可以在一個端口下創建多個套接字)?

沒有。

您應該將套接字想象為兩對信息數組:

  • {Self Port,Self Addr}
  • {Dest Port,Dest Addr}

因此,單個服務器可能有許多連接到它的{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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM