JAVA Socket的可选项有哪些

发布时间:2021-10-20 15:46:01 作者:柒染
来源:亿速云 阅读:276

这篇文章将为大家详细讲解有关JAVA Socket的可选项有哪些,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

Socket选项指定了Java Socket类所依赖的原生socket如何发送和接收数据。对于客户端Socket,Java支持9个选项:

    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

设置TCP_NODELAY为true可确保包会尽可能快地发送,而无论包的大小。
setTcpNoDelay(true)关闭了Socket的缓冲。setTcpNoDelay(false)再次启用缓冲!
缓冲关闭时,getTcpNoDelay()会返回true,如果缓冲打开,这个方法会返回false;

SO_LINGER

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

SO_LINGER选项指定了Socket关闭时如何处理尚未发送的数据。默认情况下,close()方法将立即返回,但系统仍会尝试发送剩余的数据。如果延迟时间设置为0,那么当Socket关闭时,所有未发送的数据包都将被丢弃。如果SO_LINGER打开而且延迟时间设置为任意正数,close()方法会阻塞,等待发送数据和接收确认。当过去相应秒数后,Socket关闭,所有剩余的数据都不会发送,也不会收到确认!
JAVA Socket的可选项有哪些

SO_TIMEOUT

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

正常情况下,尝试从Socket读取数据时,read()调用尽可能长的时间来得到足够的字节。设置SO_TIMEOUT可以确保这个每次调用阻塞的时间不会超过某个固定的毫秒数;0被解释为无限超时,这是默认值!

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选项控制用于网络输入的建议的接收缓冲区大小。SO_SNDBUF选项控制用于网络输入的建议的发送缓冲区大小;

SO_KEEPALIVE

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

JAVA Socket的可选项有哪些
SO_KEEPALIVE的默认值为false。如果打开了SO_KEEPALIVE,下面的代码将其关闭:

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

OOBINLINE
默认情况下,Java会忽略从Socket接收的紧急数据。不过,如果你希望接收正常数据中的紧急数据,就需要使用下面的方法设置OOBINLINE选项为true:

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

OOBINLINE的默认值为false。


SO_REUSEADDR
JAVA Socket的可选项有哪些

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

关闭还是连接

如果socket关闭,isClosed()方法会返回true,否则返回false。如果你不确定一个Socket的状态,可以用这个方法先进行检查。
不过,这不是一个万全的测试。如果一个Socket从一开始就未连接,isClosed()也返回false,尽管Socket实际上根本没有打开过。
Socket类还有一个isConnected()方法。如果这个Socket确实能够连接远程主机,isConnected()方法就会返回true,即使这个Socket已经关闭。

要查看一个Socket当前是否打开,需要检查两个条件:
//首先isConnected()要返回true,另外isClosed()要返回false。
boolen connected = socket.isConnected() && !socket.isClosed()

关于JAVA Socket的可选项有哪些就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

推荐阅读:
  1. java实现TCP通信
  2. java如何判断socket的连接?

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java socket

上一篇:Java性能如何调优

下一篇:如何理解Go中的Channel源码

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》