溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

JAVA Socket的可選項(xiàng)有哪些

發(fā)布時(shí)間:2021-10-20 15:46:01 來源:億速云 閱讀:276 作者:柒染 欄目:大數(shù)據(jù)

這篇文章將為大家詳細(xì)講解有關(guān)JAVA Socket的可選項(xiàng)有哪些,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

Socket選項(xiàng)指定了Java Socket類所依賴的原生socket如何發(fā)送和接收數(shù)據(jù)。對于客戶端Socket,Java支持9個(gè)選項(xiàng):

    TCP_NODELAY
    SO_BINDADDR
    SO_TIMEOUT
    SO_LINGER
    SO_SNDBUF
    SO_RCVBUF
    SO_KEEPALIVE
    OOBINLINE
    IP_TOS

TCP_NODELAY

public void setTcpNoDelay(boolean on) throws SocketException
public boolean getTcpNoDelay() throws SocketException

設(shè)置TCP_NODELAY為true可確保包會盡可能快地發(fā)送,而無論包的大小。
setTcpNoDelay(true)關(guān)閉了Socket的緩沖。setTcpNoDelay(false)再次啟用緩沖!
緩沖關(guān)閉時(shí),getTcpNoDelay()會返回true,如果緩沖打開,這個(gè)方法會返回false;

SO_LINGER

public void setSoLinger(boolean on, int linger) throws SocketException
public int getSoLinger() throws SocketException

SO_LINGER選項(xiàng)指定了Socket關(guān)閉時(shí)如何處理尚未發(fā)送的數(shù)據(jù)。默認(rèn)情況下,close()方法將立即返回,但系統(tǒng)仍會嘗試發(fā)送剩余的數(shù)據(jù)。如果延遲時(shí)間設(shè)置為0,那么當(dāng)Socket關(guān)閉時(shí),所有未發(fā)送的數(shù)據(jù)包都將被丟棄。如果SO_LINGER打開而且延遲時(shí)間設(shè)置為任意正數(shù),close()方法會阻塞,等待發(fā)送數(shù)據(jù)和接收確認(rèn)。當(dāng)過去相應(yīng)秒數(shù)后,Socket關(guān)閉,所有剩余的數(shù)據(jù)都不會發(fā)送,也不會收到確認(rèn)!
JAVA Socket的可選項(xiàng)有哪些

SO_TIMEOUT

public synchronized void setSoTimeout(int timeout) throws SocketException
public synchronized int getSoTimeout() throws SocketException

正常情況下,嘗試從Socket讀取數(shù)據(jù)時(shí),read()調(diào)用盡可能長的時(shí)間來得到足夠的字節(jié)。設(shè)置SO_TIMEOUT可以確保這個(gè)每次調(diào)用阻塞的時(shí)間不會超過某個(gè)固定的毫秒數(shù);0被解釋為無限超時(shí),這是默認(rèn)值!

SO_RCVBUF和SO_SNDBUF

public synchronized void setReceiveBufferSize(int size)throws SocketException
public synchronized int getReceiveBufferSize()throws SocketException
public synchronized void setSendBufferSize(int size)throws SocketException
public synchronized int getSendBufferSize() throws SocketException

SO_RCVBUF選項(xiàng)控制用于網(wǎng)絡(luò)輸入的建議的接收緩沖區(qū)大小。SO_SNDBUF選項(xiàng)控制用于網(wǎng)絡(luò)輸入的建議的發(fā)送緩沖區(qū)大??;

SO_KEEPALIVE

public void setKeepAlive(boolean on) throws SocketException
public boolean getKeepAlive() throws SocketException

JAVA Socket的可選項(xiàng)有哪些
SO_KEEPALIVE的默認(rèn)值為false。如果打開了SO_KEEPALIVE,下面的代碼將其關(guān)閉:

if(s.getKeepAlive())
{
s.setKeepAlive(false);
}

OOBINLINE
默認(rèn)情況下,Java會忽略從Socket接收的緊急數(shù)據(jù)。不過,如果你希望接收正常數(shù)據(jù)中的緊急數(shù)據(jù),就需要使用下面的方法設(shè)置OOBINLINE選項(xiàng)為true:

public void setOOBInline(boolean on) throws SocketException
public boolean getOOBInline() throws SocketException

OOBINLINE的默認(rèn)值為false。


SO_REUSEADDR
JAVA Socket的可選項(xiàng)有哪些

public void setReuseAddress(boolean on) throws SocketException
public boolean getReuseAddress() throws SocketException

關(guān)閉還是連接

如果socket關(guān)閉,isClosed()方法會返回true,否則返回false。如果你不確定一個(gè)Socket的狀態(tài),可以用這個(gè)方法先進(jìn)行檢查。
不過,這不是一個(gè)萬全的測試。如果一個(gè)Socket從一開始就未連接,isClosed()也返回false,盡管Socket實(shí)際上根本沒有打開過。
Socket類還有一個(gè)isConnected()方法。如果這個(gè)Socket確實(shí)能夠連接遠(yuǎn)程主機(jī),isConnected()方法就會返回true,即使這個(gè)Socket已經(jīng)關(guān)閉。

要查看一個(gè)Socket當(dāng)前是否打開,需要檢查兩個(gè)條件:
//首先isConnected()要返回true,另外isClosed()要返回false。
boolen connected = socket.isConnected() && !socket.isClosed()

關(guān)于JAVA Socket的可選項(xiàng)有哪些就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI