2014-09-19 31 views
0

大家都知道java中的套接字編程。我們寫如下代碼:ServerSocket.accept()方法的內部實現?

ServerSocket serverSocket = new ServerSocket(1234); 
Socket server = serverSocket.accept(); 

我們知道,我們創建的ServerSocket的對象,接下來我們寫serverSocket.accept();代碼,以接收客戶端請求。我們知道serverSocket.accept();等待新的請求到來。

但我的問題是:什麼serverSocket.accept();方法內部?可能會在while循環中運行?服務器如何識別出任何新的請求被提供服務? serverSocket.accept();方法的內部實現是什麼?任何人都有這個想法?

+0

你可以走進這個方法,看看。你也可以和調試器一起行。 – 2014-09-19 07:07:16

+0

爲什麼這個標籤的c#也是?我想如果不是系統架構,「內部」功能取決於操作系統。 – Fildor 2014-09-19 07:42:52

+0

因爲我使用C#和Java。在與其功能相關的主要案例中都是相同的。 – 2014-09-19 07:45:40

回答

0

在Linux上,ServerSocket.accept()最終(使用本機代碼)執行了一個accept系統調用(請參閱man 2 accept),該調用會阻止等待合適的傳入連接。

Java代碼或本地代碼中沒有while循環。我不知道Linux內核會發生什麼,但是在那個時候,這不再是一個Java問題。


這同樣適用於Windows上的Java,以及C#或您關心的任何其他編程語言。

+0

謝謝@Stephen C – 2014-09-19 09:14:41

0

你可以自己找到它。

public Socket accept() throws IOException { 
    if (isClosed()) 
     throw new SocketException("Socket is closed"); 
    if (!isBound()) 
     throw new SocketException("Socket is not bound yet"); 
    Socket s = new Socket((SocketImpl) null); 
    implAccept(s); 
    return s; 
} 

accept()如何工作?

+0

我知道上面的代碼在ServerSocket類中可用。我的問題是內部工作如何?我在尋找深入解答 – 2014-09-19 07:18:19