java socket参数_java socket 的参数选项解读

本文详细解析了Java中MulticastSocket和Socket的若干关键选项,包括设置多播接口、多播回环、TOS字段、linger时间、超时时间、发送及接收缓冲区大小、保持连接和紧急数据处理等,这些选项对网络通信性能和可靠性有着重要影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在MulticastSocket的源代码里有设置多播的方法:

public void setInterface(InetAddress inf) throwsSocketException {if(isClosed()) {throw new SocketException("Socket is closed");

}

checkAddress(inf,"setInterface");synchronized(infLock) {

getImpl().setOption(SocketOptions.IP_MULTICAST_IF, inf);

infAddress=inf;

}

}

7、public final static int IP_MULTICAST_IF2 = 0x1f;

这个字段的效果和上面的是一样的,只是扩展支持IPV6

8、public final static int IP_MULTICAST_LOOP = 0x12;

用来设置本地回环接口的多播特性,在MulticastSocket源代码中有相关方法:

/*** Disable/Enable local loopback of multicast datagrams

* The option is used by the platform's networking code as a hint

* for setting whether multicast data will be looped back to

* the local socket.

*

*

Because this option is a hint, applications that want to

* verify what loopback mode is set to should call

* {@link#getLoopbackMode()}

*@paramdisable true to disable the LoopbackMode

*@throwsSocketException if an error occurs while setting the value

*@since1.4

*@see#getLoopbackMode*/

public void setLoopbackMode(boolean disable) throwsSocketException {

getImpl().setOption(SocketOptions.IP_MULTICAST_LOOP, Boolean.valueOf(disable));

}

9、public final static int IP_TOS = 0x3;

这个参数是用来控制IP头中的TOS字段的,是用来控制和优化IP包的路径的,在Socket源代码里有一个设置的方法:

/*** Sets traffic class or type-of-service octet in the IP

* header for packets sent from this Socket.

* As the underlying network implementation may ignore this

* value applications should consider it a hint.

*

*

The tc must be in the range 0 <= tc <=

* 255 or an IllegalArgumentException will be thrown.

*

Notes:

*

For Internet Protocol v4 the value consists of an octet

* with precedence and TOS fields as detailed in RFC 1349. The

* TOS field is bitset created by bitwise-or'ing values such

* the following :-

*

*

*

IPTOS_LOWCOST (0x02)

*

IPTOS_RELIABILITY (0x04)

*

IPTOS_THROUGHPUT (0x08)

*

IPTOS_LOWDELAY (0x10)

*

* The last low order bit is always ignored as this

* corresponds to the MBZ (must be zero) bit.

*

* Setting bits in the precedence field may result in a

* SocketException indicating that the operation is not

* permitted.

*

* As RFC 1122 section 4.2.4.2 indicates, a compliant TCP

* implementation should, but is not required to, let application

* change the TOS field during the lifetime of a connection.

* So whether the type-of-service field can be changed after the

* TCP connection has been established depends on the implementation

* in the underlying platform. Applications should not assume that

* they can change the TOS field after the connection.

*

* For Internet Protocol v6 tc is the value that

* would be placed into the sin6_flowinfo field of the IP header.

*

*@paramtc an int value for the bitset.

*@throwsSocketException if there is an error setting the

* traffic class or type-of-service

*@since1.4

*@see#getTrafficClass*/

public void setTrafficClass(int tc) throwsSocketException {if (tc < 0 || tc > 255)throw new IllegalArgumentException("tc is not in range 0 -- 255");if(isClosed())throw new SocketException("Socket is closed");

getImpl().setOption(SocketOptions.IP_TOS,newInteger(tc));

}

从源代码的注释看,TOS设置了是否生效,和底层的操作系统的实现有关。应用程序无法保证TOS的变更会对socket连接产生影响。个人认为,TOS在一般情况下用不到。

10、public final static int SO_LINGER = 0x0080;

先看Socket源代码:

/*** Enable/disable SO_LINGER with the specified linger time in seconds.

* The maximum timeout value is platform specific.

*

* The setting only affects socket close.

*

*@paramon whether or not to linger on.

*@paramlinger how long to linger for, if on is true.

*@exceptionSocketException if there is an error

* in the underlying protocol, such as a TCP error.

*@exceptionIllegalArgumentException if the linger value is negative.

*@sinceJDK1.1

*@see#getSoLinger()*/

public void setSoLinger(boolean on, int linger) throwsSocketException {if(isClosed())throw new SocketException("Socket is closed");if (!on) {

getImpl().setOption(SocketOptions.SO_LINGER,newBoolean(on));

}else{if (linger < 0) {throw new IllegalArgumentException("invalid value for SO_LINGER");

}if (linger > 65535)

linger= 65535;

getImpl().setOption(SocketOptions.SO_LINGER,newInteger(linger));

}

}

这个字段对Socket的close方法产生影响,当这个字段设置为false时,close会立即执行并返回,如果这时仍然有未被送出的数据包,那么这些数据包将被丢弃。如果设置为True时,有一个延迟时间可以设置。这个延迟时间就是close真正执行所有等待的时间,最大为65535。

11、public final static int SO_TIMEOUT = 0x1006;

/*** Enable/disable SO_TIMEOUT with the specified timeout, in

* milliseconds. With this option set to a non-zero timeout,

* a read() call on the InputStream associated with this Socket

* will block for only this amount of time. If the timeout expires,

* a java.net.SocketTimeoutException is raised, though the

* Socket is still valid. The option must be enabled

* prior to entering the blocking operation to have effect. The

* timeout must be > 0.

* A timeout of zero is interpreted as an infinite timeout.

*@paramtimeout the specified timeout, in milliseconds.

*@exceptionSocketException if there is an error

* in the underlying protocol, such as a TCP error.

*@sinceJDK 1.1

*@see#getSoTimeout()*/

public synchronized void setSoTimeout(int timeout) throwsSocketException {if(isClosed())throw new SocketException("Socket is closed");if (timeout < 0)throw new IllegalArgumentException("timeout can't be negative");

getImpl().setOption(SocketOptions.SO_TIMEOUT,newInteger(timeout));

}

这个参数用来控制客户端读取socket数据的超时时间,如果timeout设置为0,那么就一直阻塞,否则阻塞直到超时后直接抛超时异常。

12、public final static int SO_SNDBUF = 0x1001;

在默认情况下,输出流的发送缓冲区是8096个字节(8K)。这个值是Java所建议的输出缓冲区的大小。如果这个默认值不能满足要求,可以用setSendBufferSize方法来重新设置缓冲区的大小。

13、public final static int SO_RCVBUF = 0x1002;

在默认情况下,输入流的接收缓冲区是8096个字节(8K)。这个值是Java所建议的输入缓冲区的大小。如果这个默认值不能满足要求,可以用setReceiveBufferSize方法来重新设置缓冲区的大小。

14、public final static int SO_KEEPALIVE = 0x0008;

如果将这个参数这是为True,客户端每隔一段时间(一般不少于2小时)就像服务器发送一个试探性的数据包,服务器一般会有三种回应:

1、服务器正常回一个ACK,这表明远程服务器一切OK,那么客户端不会关闭连接,而是再下一个2小时后再发个试探包。

2、服务器返回一个RST,这表明远程服务器挂了,这时候客户端会关闭连接。

3、如果服务器未响应这个数据包,在大约11分钟后,客户端Socket再发送一个数据包,如果在12分钟内,服务器还没响应,那么客户端Socket将关闭。

15、public final static int SO_OOBINLINE = 0x1003;

如果这个Socket选项打开,可以通过Socket类的sendUrgentData方法向服务器发送一个单字节的数据。这个单字节数据并不经过输出缓冲区,而是立即发出。虽然在客户端并不是使用OutputStream向服务器发送数据,但在服务端程序中这个单字节的数据是和其它的普通数据混在一起的。因此,在服务端程序中并不知道由客户端发过来的数据是由OutputStream还是由sendUrgentData发过来的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值