鴻蒙OS ServerSocket

2022-06-13 16:06 更新

ServerSocket

java.lang.Object

|---java.net.ServerSocket

public class ServerSocket
extends Object
implements Closeable

此類實現(xiàn)服務(wù)器套接字。 服務(wù)器套接字等待通過網(wǎng)絡(luò)進(jìn)入的請求。 它根據(jù)該請求執(zhí)行一些操作,然后可能將結(jié)果返回給請求者。

服務(wù)器套接字的實際工作由 SocketImpl 類的實例執(zhí)行。 應(yīng)用程序可以更改創(chuàng)建套接字實現(xiàn)的套接字工廠,以將其自身配置為創(chuàng)建適合本地防火墻的套接字。

構(gòu)造函數(shù)摘要

構(gòu)造函數(shù) 描述
ServerSocket() 創(chuàng)建一個未綁定的服務(wù)器套接字。
ServerSocket(int port) 創(chuàng)建一個綁定到指定端口的服務(wù)器套接字。
ServerSocket(int port, int backlog) 創(chuàng)建一個服務(wù)器套接字并將其綁定到指定的本地端口號,并具有指定的 backlog。
ServerSocket(int port, int backlog, InetAddress bindAddr) 創(chuàng)建具有指定端口、偵聽積壓和要綁定的本地 IP 地址的服務(wù)器。

方法總結(jié)

修飾符和類型 方法 描述
Socket accept() 偵聽要與此套接字建立的連接并接受它。
void bind(SocketAddress endpoint) 將 ServerSocket 綁定到特定地址(IP 地址和端口號)。
void bind(SocketAddress endpoint, int backlog) 將 ServerSocket 綁定到特定地址(IP 地址和端口號)。
void close() 關(guān)閉此套接字。
ServerSocketChannel getChannel() 返回與此套接字關(guān)聯(lián)的唯一 ServerSocketChannel 對象(如果有)。
InetAddress getInetAddress() 返回此服務(wù)器套接字的本地地址。
int getLocalPort() 返回此套接字正在偵聽的端口號。
SocketAddress getLocalSocketAddress() 返回此套接字綁定到的端點的地址。
int getReceiveBufferSize() 獲取此 ServerSocket 的 SocketOptions#SO_RCVBUF 選項的值,即用于從該 ServerSocket 接受的套接字的建議緩沖區(qū)大小。
boolean getReuseAddress() 測試 SocketOptions#SO_REUSEADDR 是否啟用。
int getSoTimeout() 檢索 SocketOptions#SO_TIMEOUT 的設(shè)置。
protected void implAccept(Socket s) ServerSocket 的子類使用此方法覆蓋 accept() 以返回它們自己的套接字子類。
boolean isBound() 返回 ServerSocket 的綁定狀態(tài)。
boolean isClosed() 返回 ServerSocket 的關(guān)閉狀態(tài)。
void setPerformancePreferences(int connectionTime, int latency, int bandwidth) 設(shè)置此 ServerSocket 的性能首選項。
void setReceiveBufferSize(int size) 為從此 ServerSocket 接受的套接字設(shè)置 SocketOptions#SO_RCVBUF 選項的默認(rèn)建議值。
void setReuseAddress(boolean on) 啟用/禁用 SocketOptions#SO_REUSEADDR 套接字選項。
static void setSocketFactory(SocketImplFactory fac) 為應(yīng)用程序設(shè)置服務(wù)器套接字實現(xiàn)工廠。
void setSoTimeout(int timeout) 使用指定的超時啟用/禁用 SocketOptions#SO_TIMEOUT,以毫秒為單位。
String toString() 以 String 形式返回此套接字的實現(xiàn)地址和實現(xiàn)端口。
從類 java.lang.Object 繼承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait

構(gòu)造函數(shù)詳細(xì)信息

ServerSocket

public ServerSocket() throws IOException

創(chuàng)建一個未綁定的服務(wù)器套接字。

Throws:

Throw名稱 Throw描述
IOException 打開套接字時出現(xiàn) IO 錯誤。

ServerSocket

public ServerSocket(int port) throws IOException

創(chuàng)建一個綁定到指定端口的服務(wù)器套接字。 端口號 0 表示端口號是自動分配的,通常來自臨時端口范圍。 然后可以通過調(diào)用 getLocalPort 檢索此端口號。

傳入連接指示(連接請求)的最大隊列長度設(shè)置為 50。如果在隊列已滿時連接指示到達(dá),則拒絕連接。

如果應(yīng)用程序指定了服務(wù)器套接字工廠,則調(diào)用該工廠的 createSocketImpl 方法來創(chuàng)建實際的套接字實現(xiàn)。 否則會創(chuàng)建一個“普通”套接字。

如果有安全管理器,則調(diào)用其 checkListen 方法,并將端口參數(shù)作為其參數(shù),以確保允許該操作。 這可能會導(dǎo)致 SecurityException。

參數(shù):

參數(shù)名稱 參數(shù)描述
port 端口號,或 0 使用自動分配的端口號。

Throws:

Throw名稱 Throw描述
IOException 如果在打開套接字時發(fā)生 I/O 錯誤。
SecurityException 如果安全管理器存在并且其 checkListen 方法不允許該操作。
IllegalArgumentException 如果端口參數(shù)超出指定的有效端口值范圍,即介于 0 和 65535 之間(包括 0 和 65535)。

ServerSocket

public ServerSocket(int port, int backlog) throws IOException

創(chuàng)建一個服務(wù)器套接字并將其綁定到指定的本地端口號,并具有指定的 backlog。端口號 0 表示端口號是自動分配的,通常來自臨時端口范圍。然后可以通過調(diào)用 getLocalPort 檢索此端口號。

傳入連接指示(連接請求)的最大隊列長度設(shè)置為 backlog 參數(shù)。如果隊列滿時有連接指示到達(dá),則拒絕連接。

如果應(yīng)用程序指定了服務(wù)器套接字工廠,則調(diào)用該工廠的 createSocketImpl 方法來創(chuàng)建實際的套接字實現(xiàn)。否則會創(chuàng)建一個“普通”套接字。

如果有安全管理器,則調(diào)用其 checkListen 方法,并將端口參數(shù)作為其參數(shù),以確保允許該操作。這可能會導(dǎo)致 SecurityException。 backlog 參數(shù)是套接字上請求的最大掛起連接數(shù)。它的確切語義是特定于實現(xiàn)的。特別地,實現(xiàn)可以強(qiáng)加最大長度或者可以選擇完全忽略參數(shù)。提供的值應(yīng)大于 0。如果小于或等于 0,則將使用特定于實現(xiàn)的默認(rèn)值。

參數(shù):

參數(shù)名稱 參數(shù)描述
port 端口號,或 0 使用自動分配的端口號。
backlog 請求的傳入連接隊列的最大長度。

Throws:

Throw名稱 Throw描述
IOException 如果在打開套接字時發(fā)生 I/O 錯誤。
SecurityException 如果安全管理器存在并且其 checkListen 方法不允許該操作。
IllegalArgumentException 如果端口參數(shù)超出指定的有效端口值范圍,即介于 0 和 65535 之間(包括 0 和 65535)。

ServerSocket

public ServerSocket(int port, int backlog, InetAddress bindAddr) throws IOException

創(chuàng)建具有指定端口、偵聽積壓和要綁定的本地 IP 地址的服務(wù)器。 bindAddr 參數(shù)可用于多宿主主機(jī)上的 ServerSocket,它只接受對其地址之一的連接請求。如果 bindAddr 為空,它將默認(rèn)接受任何/所有本地地址上的連接。端口必須介于 0 和 65535 之間(包括 0 和 65535)。端口號 0 表示端口號是自動分配的,通常來自臨時端口范圍。然后可以通過調(diào)用 getLocalPort 檢索此端口號。

如果有安全管理器,則此方法調(diào)用其 checkListen 方法,并將端口參數(shù)作為其參數(shù),以確保允許該操作。這可能會導(dǎo)致 SecurityException。 backlog 參數(shù)是套接字上請求的最大掛起連接數(shù)。它的確切語義是特定于實現(xiàn)的。特別地,實現(xiàn)可以強(qiáng)加最大長度或者可以選擇完全忽略參數(shù)。提供的值應(yīng)大于 0。如果小于或等于 0,則將使用特定于實現(xiàn)的默認(rèn)值。

參數(shù):

參數(shù)名稱 參數(shù)描述
port 端口號,或 0 使用自動分配的端口號。
backlog 請求的傳入連接隊列的最大長度。
bindAddr 服務(wù)器將綁定到的本地 InetAddress

Throws:

Throw名稱 Throw描述
SecurityException 如果安全管理器存在并且其 checkListen 方法不允許該操作。
IOException 如果在打開套接字時發(fā)生 I/O 錯誤。
IllegalArgumentException 如果端口參數(shù)超出指定的有效端口值范圍,即介于 0 和 65535 之間(包括 0 和 65535)。

方法詳情

bind

public void bind(SocketAddress endpoint) throws IOException

將 ServerSocket 綁定到特定地址(IP 地址和端口號)。

如果地址為空,那么系統(tǒng)將選擇一個臨時端口和一個有效的本地地址來綁定套接字。

參數(shù):

參數(shù)名稱 參數(shù)描述
endpoint 要綁定的 IP 地址和端口號。

Throws:

Throw名稱 Throw描述
IOException 如果綁定操作失敗,或者套接字已經(jīng)綁定。
SecurityException 如果存在 SecurityManager 并且其 checkListen 方法不允許該操作。
IllegalArgumentException 如果端點是此套接字不支持的 SocketAddress 子類

bind

public void bind(SocketAddress endpoint, int backlog) throws IOException

將 ServerSocket 綁定到特定地址(IP 地址和端口號)。

如果地址為空,那么系統(tǒng)將選擇一個臨時端口和一個有效的本地地址來綁定套接字。

backlog 參數(shù)是套接字上請求的最大掛起連接數(shù)。 它的確切語義是特定于實現(xiàn)的。 特別地,實現(xiàn)可以強(qiáng)加最大長度或者可以選擇完全忽略參數(shù)。 提供的值應(yīng)大于 0。如果小于或等于 0,則將使用特定于實現(xiàn)的默認(rèn)值。

參數(shù):

參數(shù)名稱 參數(shù)描述
endpoint 要綁定的 IP 地址和端口號。
backlog 請求的傳入連接隊列的最大長度。

Throws:

Throw名稱 Throw描述
IOException 如果綁定操作失敗,或者套接字已經(jīng)綁定。
SecurityException 如果存在 SecurityManager 并且其 checkListen 方法不允許該操作。
IllegalArgumentException 如果端點是此套接字不支持的 SocketAddress 子類

getInetAddress

public InetAddress getInetAddress()

返回此服務(wù)器套接字的本地地址。

如果socket在關(guān)閉之前就綁定了,那么這個方法會在socket關(guān)閉后繼續(xù)返回本地地址。

如果設(shè)置了安全管理器,則使用本地地址和 -1 作為其參數(shù)調(diào)用其 checkConnect 方法,以查看是否允許該操作。 如果不允許該操作,則返回 InetAddress#getLoopbackAddress 地址。

返回:

此套接字綁定到的地址,如果安全管理器拒絕,則返回環(huán)回地址,如果套接字未綁定,則返回 null。

getLocalPort

public int getLocalPort()

返回此套接字正在偵聽的端口號。

如果套接字在關(guān)閉之前已綁定,則此方法將在套接字關(guān)閉后繼續(xù)返回端口號。

返回:

此套接字正在偵聽的端口號,如果尚未綁定套接字,則為 -1。

getLocalSocketAddress

public SocketAddress getLocalSocketAddress()

返回此套接字綁定到的端點的地址。

如果套接字在關(guān)閉之前已綁定,則該方法將在套接字關(guān)閉后繼續(xù)返回端點的地址。

如果設(shè)置了安全管理器,則使用本地地址和 -1 作為其參數(shù)調(diào)用其 checkConnect 方法,以查看是否允許該操作。 如果不允許該操作,則返回代表 InetAddress#getLoopbackAddress 地址和套接字綁定的本地端口的 SocketAddress。

返回:

表示此套接字的本地端點的 SocketAddress,如果安全管理器拒絕,則表示環(huán)回地址的 SocketAddress,如果尚未綁定套接字,則返回 null。

accept

public Socket accept() throws IOException

偵聽要與此套接字建立的連接并接受它。 該方法阻塞,直到建立連接。

創(chuàng)建一個新的 Socket s,如果有安全管理器,則使用 s.getInetAddress().getHostAddress() 和 s.getPort() 作為其參數(shù)調(diào)用安全管理器的 checkAccept 方法,以確保允許操作。 這可能會導(dǎo)致 SecurityException。

返回:

新的 Socket

Throws:

Throw名稱 Throw描述
IOException 如果在等待連接時發(fā)生 I/O 錯誤。
SecurityException 如果存在安全管理器并且其 checkAccept 方法不允許該操作。
SocketTimeoutException 如果先前使用 setSoTimeout 設(shè)置了超時并且已達(dá)到超時。
IllegalBlockingModeException 如果此套接字有關(guān)聯(lián)的通道,則通道處于非阻塞模式,并且沒有準(zhǔn)備好接受的連接

implAccept

protected final void implAccept(Socket s) throws IOException

ServerSocket 的子類使用此方法覆蓋 accept() 以返回它們自己的套接字子類。 所以 FooServerSocket 通常會給這個方法一個空的 FooSocket。 從 implAccept 返回時,F(xiàn)ooSocket 將連接到客戶端。

參數(shù):

參數(shù)名稱 參數(shù)描述
s 套接字

Throws:

Throw名稱 Throw描述
IllegalBlockingModeException 如果此套接字具有關(guān)聯(lián)的通道,并且該通道處于非阻塞模式
IOException 如果在等待連接時發(fā)生 I/O 錯誤。

close

public void close() throws IOException

關(guān)閉此套接字。 當(dāng)前在 accept() 中阻塞的任何線程都會拋出 SocketException。

如果此套接字具有關(guān)聯(lián)的通道,則該通道也將關(guān)閉。

指定者:

在接口 AutoCloseable 中關(guān)閉

指定者:

在接口Closeable中關(guān)閉

Throws:

Throw名稱 Throw描述
IOException 如果關(guān)閉套接字時發(fā)生 I/O 錯誤。

getChannel

public ServerSocketChannel getChannel()

返回與此套接字關(guān)聯(lián)的唯一 ServerSocketChannel 對象(如果有)。

當(dāng)且僅當(dāng)通道本身是通過 ServerSocketChannel.open 方法創(chuàng)建時,服務(wù)器套接字才會有通道。

返回:

與此套接字關(guān)聯(lián)的服務(wù)器套接字通道,如果此套接字不是為通道創(chuàng)建的,則為 null

isBound

public boolean isBound()

返回 ServerSocket 的綁定狀態(tài)。

返回:

如果 ServerSocket 成功綁定到地址,則為 true

isClosed

public boolean isClosed()

返回 ServerSocket 的關(guān)閉狀態(tài)。

返回:

如果套接字已關(guān)閉,則為 true

setSoTimeout

public void setSoTimeout(int timeout) throws SocketException

使用指定的超時啟用/禁用 SocketOptions#SO_TIMEOUT,以毫秒為單位。 將此選項設(shè)置為非零超時,對此 ServerSocket 的 accept() 調(diào)用將僅阻塞此時間量。 如果超時到期,則會引發(fā) java.net.SocketTimeoutException,盡管 ServerSocket 仍然有效。 必須在進(jìn)入阻塞操作之前啟用該選項才能生效。 超時必須 > 0。超時為零被解釋為無限超時。

參數(shù):

參數(shù)名稱 參數(shù)描述
timeout 指定的超時時間,以毫秒為單位

Throws:

Throw名稱 Throw描述
SocketException 如果底層協(xié)議有錯誤,例如 TCP 錯誤。

getSoTimeout

public int getSoTimeout() throws IOException

檢索 SocketOptions#SO_TIMEOUT 的設(shè)置。 返回 0 表示該選項被禁用(即無限超時)。

返回:

SocketOptions#SO_TIMEOUT 值

Throws:

Throw名稱 Throw描述
IOException 如果發(fā)生 I/O 錯誤

setReuseAddress

public void setReuseAddress(boolean on) throws SocketException

啟用/禁用 SocketOptions#SO_REUSEADDR 套接字選項。

當(dāng) TCP 連接關(guān)閉時,連接可能會在連接關(guān)閉后的一段時間內(nèi)保持超時狀態(tài)(通常稱為 TIME_WAIT 狀態(tài)或 2MSL 等待狀態(tài))。 對于使用眾所周知的套接字地址或端口的應(yīng)用程序,如果存在涉及套接字地址或端口的處于超時狀態(tài)的連接,則可能無法將套接字綁定到所需的 SocketAddress。

在使用 bind(java.net.SocketAddress) 綁定套接字之前啟用 SocketOptions#SO_REUSEADDR 允許綁定套接字,即使先前的連接處于超時狀態(tài)。

創(chuàng)建 ServerSocket 時,未定義 SocketOptions#SO_REUSEADDR 的初始設(shè)置。 應(yīng)用程序可以使用 getReuseAddress() 來確定 SocketOptions#SO_REUSEADDR 的初始設(shè)置。

未定義套接字綁定后啟用或禁用 SocketOptions#SO_REUSEADDR 時的行為。

參數(shù):

參數(shù)名稱 參數(shù)描述
on 是否啟用或禁用套接字選項

Throws:

Throw名稱 Throw描述
SocketException 如果啟用或禁用 SocketOptions#SO_REUSEADDR 套接字選項發(fā)生錯誤,或者套接字已關(guān)閉。

getReuseAddress

public boolean getReuseAddress() throws SocketException

測試 SocketOptions#SO_REUSEADDR 是否啟用。

返回:

一個布爾值,指示是否啟用 SocketOptions#SO_REUSEADDR。

Throws:

Throw名稱 Throw描述
SocketException 如果底層協(xié)議有錯誤,例如 TCP 錯誤。

toString

public String toString()

以 String 形式返回此套接字的實現(xiàn)地址和實現(xiàn)端口。

如果設(shè)置了安全管理器,則使用本地地址和 -1 作為其參數(shù)調(diào)用其 checkConnect 方法,以查看是否允許該操作。 如果不允許該操作,則返回一個表示 InetAddress#getLoopbackAddress 地址的 InetAddress 作為實現(xiàn)地址。

覆蓋:

類 Object 中的 toString

返回:

此套接字的字符串表示形式。

setSocketFactory

public static void setSocketFactory(SocketImplFactory fac) throws IOException

為應(yīng)用程序設(shè)置服務(wù)器套接字實現(xiàn)工廠。 工廠只能指定一次。

當(dāng)應(yīng)用程序創(chuàng)建新的服務(wù)器套接字時,會調(diào)用套接字實現(xiàn)工廠的 createSocketImpl 方法來創(chuàng)建實際的套接字實現(xiàn)。

除非已經(jīng)設(shè)置了工廠,否則將 null 傳遞給方法是無操作的。

如果有安全管理器,該方法首先調(diào)用安全管理器的 checkSetFactory 方法,確保操作被允許。 這可能會導(dǎo)致 SecurityException。

參數(shù):

參數(shù)名稱 參數(shù)描述
fac 想要的工廠。

Throws:

Throw名稱 Throw描述
IOException 如果設(shè)置套接字工廠時發(fā)生 I/O 錯誤。
SocketException 如果工廠已經(jīng)定義。
SecurityException 如果存在安全管理器并且其 checkSetFactory 方法不允許該操作。

setReceiveBufferSize

public void setReceiveBufferSize(int size) throws SocketException

為從此 ServerSocket 接受的套接字設(shè)置 SocketOptions#SO_RCVBUF 選項的默認(rèn)建議值。在接受的套接字中實際設(shè)置的值必須在接受()返回套接字后通過調(diào)用Socket#getReceiveBufferSize()來確定。

SocketOptions#SO_RCVBUF 的值既用于設(shè)置內(nèi)部套接字接收緩沖區(qū)的大小,也用于設(shè)置通告給遠(yuǎn)程對等方的 TCP 接收窗口的大小。

隨后可以通過調(diào)用 Socket#setReceiveBufferSize(int) 來更改該值。但是,如果應(yīng)用程序希望允許大于 64K 字節(jié)的接收窗口(如 RFC1323 所定義),則必須在 ServerSocket 中設(shè)置建議的值,然后才能將其綁定到本地地址。這意味著,必須使用無參數(shù)構(gòu)造函數(shù)創(chuàng)建 ServerSocket,然后必須調(diào)用 setReceiveBufferSize(),最后通過調(diào)用 bind() 將 ServerSocket 綁定到地址。

不這樣做不會導(dǎo)致錯誤,并且緩沖區(qū)大小可能會設(shè)置為請求的值,但從該 ServerSocket 接受的套接字中的 TCP 接收窗口將不大于 64K 字節(jié)。

參數(shù):

參數(shù)名稱 參數(shù)描述
size 設(shè)置接收緩沖區(qū)大小的大小。 該值必須大于 0。

Throws:

Throw名稱 Throw描述
SocketException 如果底層協(xié)議有錯誤,例如 TCP 錯誤。
IllegalArgumentException 如果值為 0 或為負(fù)數(shù)。

getReceiveBufferSize

public int getReceiveBufferSize() throws SocketException

獲取此 ServerSocket 的 SocketOptions#SO_RCVBUF 選項的值,即用于從該 ServerSocket 接受的套接字的建議緩沖區(qū)大小。

注意,在接受的套接字中實際設(shè)置的值是通過調(diào)用 Socket#getReceiveBufferSize() 確定的。

返回:

此 Socket 的 SocketOptions#SO_RCVBUF 選項的值。

Throws:

Throw名稱 Throw描述
SocketException 如果底層協(xié)議有錯誤,例如 TCP 錯誤。

setPerformancePreferences

public void setPerformancePreferences(int connectionTime, int latency, int bandwidth)

設(shè)置此 ServerSocket 的性能首選項。

套接字默認(rèn)使用 TCP/IP 協(xié)議。一些實現(xiàn)可能會提供與 TCP/IP 具有不同性能特征的替代協(xié)議。此方法允許應(yīng)用程序表達(dá)自己的偏好,即當(dāng)實現(xiàn)從可用協(xié)議中進(jìn)行選擇時應(yīng)如何進(jìn)行這些權(quán)衡。

性能偏好由三個整數(shù)描述,其值表示短連接時間、低延遲和高帶寬的相對重要性。整數(shù)的絕對值無關(guān)緊要;為了選擇一個協(xié)議,這些值被簡單地比較,較大的值表示更強(qiáng)的偏好。例如,如果應(yīng)用程序更喜歡短連接時間而不是低延遲和高帶寬,那么它可以使用值 (1, 0, 0) 調(diào)用此方法。如果應(yīng)用程序更喜歡高帶寬而不是低延遲,以及低延遲而不是短連接時間,那么它可以使用值 (0, 1, 2) 調(diào)用此方法。

綁定此套接字后調(diào)用此方法將無效。這意味著為了使用此功能,需要使用無參數(shù)構(gòu)造函數(shù)創(chuàng)建套接字。

參數(shù):

參數(shù)名稱 參數(shù)描述
connectionTime 表示短連接時間的相對重要性的 int
latency 一個表示低延遲相對重要性的 int
bandwidth 表示高帶寬相對重要性的 int
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號