JavaTM 2 Platform
Standard Ed. 6

java.net
類別 ServerSocket

java.lang.Object
  繼承者 java.net.ServerSocket
直接已知子類別:
SSLServerSocket

public class ServerSocket
extends Object

此類別實作伺服器Socket。伺服器Socket等待請求通過網路傳入。它基於該請求執行某些操作,然後可能向請求者返回結果。

伺服器Socket的實際工作由 SocketImpl 類別的實例執行。應用程序可以更改創建Socket實作的Socket處理器來配置它自身,從而創建適合本地防火牆的Socket。

從以下版本開始:
JDK1.0
另請參見:
SocketImpl, setSocketFactory(java.net.SocketImplFactory), ServerSocketChannel

建構子摘要
ServerSocket()
          創建非綁定伺服器Socket。
ServerSocket(int port)
          創建綁定到特定埠號的伺服器Socket。
ServerSocket(int port, int backlog)
          利用指定的 backlog 創建伺服器Socket並將其綁定到指定的本地埠號號。
ServerSocket(int port, int backlog, InetAddress bindAddr)
          使用指定的埠號、偵聽 backlog 和要綁定到的本地 IP 位址創建伺服器。
 
方法摘要
 Socket accept()
          偵聽並接受到此Socket的連接。
 void bind(SocketAddress endpoint)
          將 ServerSocket 綁定到特定位址(IP 位址和埠號號)。
 void bind(SocketAddress endpoint, int backlog)
          將 ServerSocket 綁定到特定位址(IP 位址和埠號號)。
 void close()
          關閉此Socket。
 ServerSocketChannel getChannel()
          返回與此Socket關聯的唯一 ServerSocketChannel 物件(如果有)。
 InetAddress getInetAddress()
          返回此伺服器Socket的本地位址。
 int getLocalPort()
          返回此Socket在其上偵聽的埠號。
 SocketAddress getLocalSocketAddress()
          返回此Socket綁定的端點的位址,如果尚未綁定則返回 null
 int getReceiveBufferSize()
          獲取此 ServerSocket 的 SO_RCVBUF 選項的值,該值是將用於從此 ServerSocket 接受的Socket的建議緩衝區大小。
 boolean getReuseAddress()
          測試是否啟用 SO_REUSEADDR。
 int getSoTimeout()
          獲取 SO_TIMEOUT 的設置。
protected  void implAccept(Socket s)
          ServerSocket 的子類別使用此方法覆寫 accept() 以返回它們自己的Socket子類別。
 boolean isBound()
          返回 ServerSocket 的綁定狀態。
 boolean isClosed()
          返回 ServerSocket 的關閉狀態。
 void setPerformancePreferences(int connectionTime, int latency, int bandwidth)
          設置此 ServerSocket 的性能首選項。
 void setReceiveBufferSize(int size)
          為從此 ServerSocket 接受的Socket的 SO_RCVBUF 選項設置預設建議值。
 void setReuseAddress(boolean on)
          啟用/禁用 SO_REUSEADDR Socket選項。
static void setSocketFactory(SocketImplFactory fac)
          為應用程序設置伺服器Socket實作處理器。
 void setSoTimeout(int timeout)
          通過指定逾時值啟用/禁用 SO_TIMEOUT,以毫秒為單位。
 String toString()
          作為 String 返回此Socket的實作位址和實作埠號。
 
從類別 java.lang.Object 繼承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

建構子詳細資訊

ServerSocket

public ServerSocket()
             throws IOException
創建非綁定伺服器Socket。

拋出:
IOException - 如果打開Socket時發生 IO 錯誤。

ServerSocket

public ServerSocket(int port)
             throws IOException
創建綁定到特定埠號的伺服器Socket。埠號 0 在所有空閒埠號上創建Socket。

傳入連接指示(對連接的請求)的最大佇列長度被設置為 50。如果佇列滿時收到連接指示,則拒絕該連接。

如果應用程序已指定伺服器Socket處理器,則調用該處理器的 createSocketImpl 方法來創建實際Socket實作。否則創建“普通”Socket。

如果存在安全管理器,則首先使用 port 參數作為參數調用其 checkListen 方法,以確保允許該操作。這可能會導致 SecurityException 異常。

參數:
port - 埠號號;或者為 0,表示使用任何空閒埠號。
拋出:
IOException - 如果打開Socket時發生 I/O 錯誤。
SecurityException - 如果安全管理器存在並且其 checkListen 方法不允許進行該操作。
另請參見:
SocketImpl, SocketImplFactory.createSocketImpl(), setSocketFactory(java.net.SocketImplFactory), SecurityManager.checkListen(int)

ServerSocket

public ServerSocket(int port,
                    int backlog)
             throws IOException
利用指定的 backlog 創建伺服器Socket並將其綁定到指定的本地埠號號。埠號號 0 在所有空閒埠號上創建Socket。

傳入連接指示(對連接的請求)的最大佇列長度被設置為 backlog 參數。如果佇列滿時收到連接指示,則拒絕該連接。

如果應用程序已指定伺服器Socket處理器,則調用該處理器的 createSocketImpl 方法來創建實際Socket實作。否則創建“普通”Socket。

如果存在安全管理器,則首先使用 port 參數作為參數調用其 checkListen 方法,以確保允許該操作。這可能會導致 SecurityException 異常。

backlog 參數必須是大於 0 的正值。如果傳遞的值等於或小於 0,則使用預設值。

參數:
port - 指定的埠號;或者為 0,表示使用任何空閒埠號。
backlog - 佇列的最大長度。
拋出:
IOException - 如果打開Socket時發生 I/O 錯誤。
SecurityException - 如果安全管理器存在並且其 checkListen 方法不允許進行該操作。
另請參見:
SocketImpl, SocketImplFactory.createSocketImpl(), setSocketFactory(java.net.SocketImplFactory), SecurityManager.checkListen(int)

ServerSocket

public ServerSocket(int port,
                    int backlog,
                    InetAddress bindAddr)
             throws IOException
使用指定的埠號、偵聽 backlog 和要綁定到的本地 IP 位址創建伺服器。bindAddr 參數可以在 ServerSocket 的多宿主主機 (multi-homed host) 上使用,ServerSocket 僅接受對其位址之一的連接請求。如果 bindAddr 為 null,則預設接受任何/所有本地位址上的連接。埠號必須在 0 到 65535 之間(包括兩者)。

如果存在安全管理器,則此方法使用 port 作為參數調用其 checkListen 方法,以確保允許該操作。這可能會導致 SecurityException 異常。

backlog 參數必須是大於 0 的正值。如果傳遞的值等於或小於 0,則使用預設值。

參數:
port - 本地 TCP 埠號
backlog - 偵聽 backlog
bindAddr - 要將伺服器綁定到的 InetAddress
拋出:
SecurityException - 如果安全管理器存在並且其 checkListen 方法不允許進行該操作。
IOException - 如果打開Socket時發生 I/O 錯誤。
從以下版本開始:
JDK1.1
另請參見:
SocketOptions, SocketImpl, SecurityManager.checkListen(int)
方法詳細資訊

bind

public void bind(SocketAddress endpoint)
          throws IOException
ServerSocket 綁定到特定位址(IP 位址和埠號號)。

如果位址為 null,則系統將挑選一個臨時埠號和一個有效本地位址來綁定Socket。

參數:
endpoint - 要綁定的 IP 位址和埠號號。
拋出:
IOException - 如果綁定操作失敗或者已經綁定了Socket。
SecurityException - 如果 SecurityManager 存在並且其 checkListen 方法不允許該操作。
IllegalArgumentException - 如果端點是不受此Socket支持的 SocketAddress 子類別
從以下版本開始:
1.4

bind

public void bind(SocketAddress endpoint,
                 int backlog)
          throws IOException
ServerSocket 綁定到特定位址(IP 位址和埠號號)。

如果位址為 null,則系統將挑選一個臨時埠號和一個有效本地位址來綁定Socket。

backlog 參數必須是大於 0 的正值。如果傳遞的值等於或小於 0,則使用預設值。

參數:
endpoint - 要綁定的 IP 位址和埠號號。
backlog - 偵聽 backlog 長度。
拋出:
IOException - 如果綁定操作失敗或者已經綁定了Socket。
SecurityException - 如果 SecurityManager 存在並且其 checkListen 方法不允許該操作。
IllegalArgumentException - 如果端點是不受此Socket支持的 SocketAddress 子類別
從以下版本開始:
1.4

getInetAddress

public InetAddress getInetAddress()
返回此伺服器Socket的本地位址。

返回:
將此Socket綁定到的位址;如果Socket是未綁定的,則返回 null

getLocalPort

public int getLocalPort()
返回此Socket在其上偵聽的埠號。

返回:
此Socket偵聽的埠號號;如果尚未綁定Socket,則返回 -1。

getLocalSocketAddress

public SocketAddress getLocalSocketAddress()
返回此Socket綁定的端點的位址,如果尚未綁定則返回 null

返回:
表示此Socket的本地端點的 SocketAddress,如果尚未綁定則返回 null
從以下版本開始:
1.4
另請參見:
getInetAddress(), getLocalPort(), bind(SocketAddress)

accept

public Socket accept()
              throws IOException
偵聽並接受到此Socket的連接。此方法在連接傳入之前一直阻塞。

創建新Socket s,如果存在安全管理器,則使用 s.getInetAddress().getHostAddress()s.getPort() 作為參數調用安全管理器的 checkAccept 方法,以確保允許該操作。這可能會導致 SecurityException 異常。

返回:
新Socket
拋出:
IOException - 如果等待連接時發生 I/O 錯誤。
SecurityException - 如果安全管理器存在並且其 checkAccept 方法不允許進行該操作。
SocketTimeoutException - 如果以前使用 setSoTimeout 設置了逾時並且已到達逾時值。
IllegalBlockingModeException - 如果此Socket具有關聯的通道、通道處於非阻塞網要並且不存在準備接受的連接
另請參見:
SecurityManager.checkAccept(java.lang.String, int)

implAccept

protected final void implAccept(Socket s)
                         throws IOException
ServerSocket 的子類別使用此方法覆寫 accept() 以返回它們自己的Socket子類別。因此,FooServerSocket 通常傳遞給此方法一個 FooSocket。從 implAccept 返回時,FooSocket 將連接到客戶端。

參數:
s - Socket
拋出:
IllegalBlockingModeException - 如果此Socket具有關聯通道並且通道處於非阻塞網要
IOException - 如果在等待連接時發生 I/O 錯誤。
從以下版本開始:
JDK1.1

close

public void close()
           throws IOException
關閉此Socket。 在 accept() 中所有當前阻塞的執行緒都將會拋出 SocketException

如果此Socket有一個與之關聯的通道,則關閉該通道。

拋出:
IOException - 如果關閉Socket時發生 I/O 錯誤。

getChannel

public ServerSocketChannel getChannel()
返回與此Socket關聯的唯一 ServerSocketChannel 物件(如果有)。

當且僅當通過 ServerSocketChannel.open 方法創建了通道本身時,伺服器Socket才具有一個通道。

返回:
與此Socket關聯的伺服器Socket通道,如果沒有為通道創建Socket,則返回 null
從以下版本開始:
1.4

isBound

public boolean isBound()
返回 ServerSocket 的綁定狀態。

返回:
如果將 ServerSocket 成功地綁定到一個位址,則返回 true
從以下版本開始:
1.4

isClosed

public boolean isClosed()
返回 ServerSocket 的關閉狀態。

返回:
如果已經關閉了Socket,則返回 true
從以下版本開始:
1.4

setSoTimeout

public void setSoTimeout(int timeout)
                  throws SocketException
通過指定逾時值啟用/禁用 SO_TIMEOUT,以毫秒為單位。將此選項設為非零的逾時值時,對此 ServerSocket 調用 accept() 將只阻塞此時間長度。如果超過逾時值,將引發 java.net.SocketTimeoutException,雖然 ServerSocket 仍舊有效。選項必須在進入阻塞操作前被啟用才能生效。逾時值必須是 > 0 的數。逾時值為 0 被解釋為無窮大逾時值。

參數:
timeout - 指定的逾時(以毫秒為單位)
拋出:
SocketException - 如果在底層協議中存在錯誤,如 TCP 錯誤。
從以下版本開始:
JDK1.1
另請參見:
getSoTimeout()

getSoTimeout

public int getSoTimeout()
                 throws IOException
獲取 SO_TIMEOUT 的設置。返回 0 意味著禁用了選項(即無窮大的逾時值)。

返回:
SO_TIMEOUT 值
拋出:
IOException - 如果發生 I/O 錯誤
從以下版本開始:
JDK1.1
另請參見:
setSoTimeout(int)

setReuseAddress

public void setReuseAddress(boolean on)
                     throws SocketException
啟用/禁用 SO_REUSEADDR Socket選項。

關閉 TCP 連接時,該連接可能在關閉後的一段時間內保持逾時狀態(通常稱為 TIME_WAIT 狀態或 2MSL 等待狀態)。對於使用已知Socket位址或埠號的應用程序而言,如果存在處於逾時狀態的連接(包括位址和埠號),可能不能將Socket綁定到所需的 SocketAddress

在使用 bind(SocketAddress) 綁定Socket前啟用 SO_REUSEADDR 可允許上一個連接處於逾時狀態時綁定Socket。

當創建 ServerSocket 時,SO_REUSEADDR 的初始設置是不確定的。應用程序可以使用 getReuseAddress() 來確定 SO_REUSEADDR 的初始設置。

在綁定Socket(請參閱 isBound())後啟用或禁用 SO_REUSEADDR 時的行為是不確定的。

參數:
on - 是否啟用 SO_REUSEADDR Socket選項
拋出:
SocketException - 如果啟用或禁用 SO_RESUEADDR Socket選項時發生錯誤,或者關閉了Socket。
從以下版本開始:
1.4
另請參見:
getReuseAddress(), bind(SocketAddress), isBound(), isClosed()

getReuseAddress

public boolean getReuseAddress()
                        throws SocketException
測試是否啟用 SO_REUSEADDR。

返回:
指示是否啟用 SO_REUSEADDR 的 boolean 值。
拋出:
SocketException - 如果底層協議出現錯誤,例如 TCP 錯誤。
從以下版本開始:
1.4
另請參見:
setReuseAddress(boolean)

toString

public String toString()
作為 String 返回此Socket的實作位址和實作埠號。

覆寫:
類別 Object 中的 toString
返回:
此Socket的字元串表示形式。

setSocketFactory

public static void setSocketFactory(SocketImplFactory fac)
                             throws IOException
為應用程序設置伺服器Socket實作處理器。處理器只能指定一次。

當應用程序創建新的伺服器Socket時,調用Socket實作處理器的 createSocketImpl 方法創建實際的Socket實作。

除非已經設置了處理器,否則向該方法傳遞 null 是無操作。

如果有安全管理器,則此方法首先調用安全管理器的 checkSetFactory 方法,以確保允許進行此操作。這可能會導致 SecurityException 異常。

參數:
fac - 所需的處理器。
拋出:
IOException - 如果設置Socket處理器時發生 I/O 錯誤。
SocketException - 如果已經定義該處理器。
SecurityException - 如果安全管理器存在並且其 checkSetFactory 方法不允許進行該操作。
另請參見:
SocketImplFactory.createSocketImpl(), SecurityManager.checkSetFactory()

setReceiveBufferSize

public void setReceiveBufferSize(int size)
                          throws SocketException
為從此 ServerSocket 接受的Socket的 SO_RCVBUF 選項設置預設建議值。在接受的Socket中實際設置的值必須在 accept() 返回Socket後通過調用 Socket.getReceiveBufferSize() 確定。

SO_RCVBUF 的值用於設置內部Socket接收緩衝區的大小和設置公佈到遠端同位體的 TCP 接收視窗的大小。

隨後可以通過調用 Socket.setReceiveBufferSize(int) 更改該值。但是,如果應用程序希望允許大於 RFC1323 中定義的 64K 位元組的接收視窗,則在將 ServerSocket 綁定到本地位址之前必須在其中設置建議值。這意味著,必須用無參數建構子創建 ServerSocket,然後必須調用 setReceiveBufferSize(),最後通過調用 bind() 將 ServerSocket 綁定到位址。

未能執行此操作不會導致錯誤,緩衝區大小可能被設置為所請求的值,但是從此 ServerSocket 中接受的Socket中的 TCP 接收視窗將不再大於 64K 位元組。

參數:
size - 要設置的接收緩衝區大小。此值必須大於 0。
拋出:
SocketException - 如果底層協議出現錯誤,例如 TCP 錯誤。
IllegalArgumentException - 如果值為 0 或負。
從以下版本開始:
1.4
另請參見:
getReceiveBufferSize()

getReceiveBufferSize

public int getReceiveBufferSize()
                         throws SocketException
獲取此 ServerSocket 的 SO_RCVBUF 選項的值,該值是將用於從此 ServerSocket 接受的Socket的建議緩衝區大小。

注意,在接受的Socket中實際設置的值通過調用 Socket.getReceiveBufferSize() 來確定。

返回:
Socket 的 SO_RCVBUF 選項的值。
拋出:
SocketException - 如果底層協議出現錯誤,例如 TCP 錯誤。
從以下版本開始:
1.4
另請參見:
setReceiveBufferSize(int)

setPerformancePreferences

public void setPerformancePreferences(int connectionTime,
                                      int latency,
                                      int bandwidth)
設置此 ServerSocket 的性能首選項。

預設情況下Socket使用 TCP/IP 協議。有些實作可能提供與 TCP/IP 具有不同性能特徵的替代協議。此方法允許應用程序在實作從可用協議中作出選擇時表明它自己關於應該如何進行折衷的首選項。

性能首選項由三個整數描述,它們的值分別指示短連接時間、低延遲和高帶寬的相對重要性。這些整數的絕對值沒有意義;為了選擇協議,需要簡單地比較它們的值,較大的值指示更強的首選項。例如,如果應用程序相對於低延遲和高帶寬更希望短連接時間,則其可以使用值 (1, 0, 0) 調用此方法。如果應用程序相對於低延遲更希望高帶寬,且相對於短連接時間更希望低延遲,則其可以使用值 (0, 1, 2) 調用此方法。

在綁定Socket後調用此方法無效。這意味著,需要利用無參數建構子創建Socket才能使用此功能。

參數:
connectionTime - 表明短連接時間的相對重要性的 int
latency - 表明低延遲的相對重要性的 int
bandwidth - 表明高帶寬的相對重要性的 int
從以下版本開始:
1.5

JavaTM 2 Platform
Standard Ed. 6

提交錯誤或意見

版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only