JAVA Socket-01:可选项

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关闭,所有剩余的数据都不会发送,也不会收到确认!
d1a27834aa19d5057772b5bc395d41fb4c6.jpg

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

3ccb1770d64a3f3cc07093fd085902a9d19.jpg
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
1156d066af28cc29e7245566ec8dee431bd.jpg

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();
 

转载于:https://my.oschina.net/blacklands/blog/3093523

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值