java socket参数选项主要用于控制socket通信过程。如超时,保持连接,缓存大小设置等。
TCP_NODELAY
如果这个参数被设置为True,那么就是关闭Nagle算法,实现无延迟传输,如果设置为false,则是打开这个算法,会对发送的数据进行缓存。
注:Nagle算法就是将多个小的报文缓存成一个大的报文进行发送,避免网络中存在大量的短报文。
SO_BINDADDR
获取绑定套接字的本地地址(不能设置此选项,只能获取,因为套接字是在创建时绑定的,所以本地绑定的地址不可更改)。
SO_REUSEADDR
这个参数表示套接字对端口是否可重用。
这个套接字选项通知内核,如果端口忙,但TCP状态位于 TIME_WAIT ,可以重用端口。如果端口忙,而TCP状态位于其他状态,重用端口时依旧得到一个错误信息,指明"地址已经使用中"。如果你的服务程序停止后想立即重启,而新套接字依旧使用同一端口,此时 SO_REUSEADDR 选项非常有用。必须意识到,此时任何非期望数据到达,都可能导致服务程序反应混乱,不过这只是一种可能,事实上很不可能。
一个套接字由相关五元组构成,协议、本地地址、本地端口、远程地址、远程端口。SO_REUSEADDR 仅仅表示可以重用本地地址、本地端口,整个相关五元组还是唯一确定的。所以,重启后的服务程序有可能收到非期望数据。必须慎重使用 SO_REUSEADDR 选项。
注:此参数只能在多播中使用且在多播中默认使用。
SO_BROADCAST
这个参数选项用来控制广播,目前只有在DatagramSocket里支持。
IP_MULTICAST_IF
用来控制多播的参数选项,目前只有在MulticastSocket里支持
IP_MULTICAST_IF2
这个字段的效果和上面的是一样的,只是扩展支持IPV6
IP_MULTICAST_LOOP
用来设置本地回环接口的多播特性。
IP_TOS
这个参数是用来控制IP头中的TOS字段的,是用来控制和优化IP包的路径的。有如下四个选项:
IPTOS_LOWCOST:发送低成本。
IPTOS_RELIABLITY:高可靠性。
IPTOS_THROUGHPUT:最高吞吐量。
IPTOS_LOWDELAY:最小延时。
TOS设置了是否生效,和底层的操作系统的实现有关。应用程序无法保证TOS的变更会对socket连接产生影响。serversocket设置IP_TOS无效。
SO_LINGER
这个字段对Socket的close方法产生影响,当这个字段设置为false时,close会立即执行并返回,如果这时仍然有未被送出的数据包,那么这些数据包将被丢弃。如果设置为True时,有一个延迟时间可以设置。这个延迟时间就是close真正执行所有等待的时间,最大为65535秒。
SO_TIMEOUT
这个参数用来控制客户端读取socket数据的超时时间,如果timeout设置为0,那么就一直阻塞,否则阻塞直到超时后直接抛超时异常。
SO_SNDBUF
在默认情况下,输出流的发送缓冲区是8096个字节(8K)。这个值是Java所建议的输出缓冲区的大小。如果这个默认值不能满足要求,可以用setSendBufferSize方法来重新设置缓冲区的大小。
SO_RCVBUF
在默认情况下,输入流的接收缓冲区是8096个字节(8K)。这个值是Java所建议的输入缓冲区的大小。如果这个默认值不能满足要求,可以用setReceiveBufferSize方法来重新设置缓冲区的大小。
SO_KEEPALIVE
如果将这个参数这是为True,客户端每隔一段时间(一般不少于2小时)就像服务器发送一个试探性的数据包,服务器一般会有三种回应:
1、服务器正常回一个ACK,这表明远程服务器一切OK,那么客户端不会关闭连接,而是再下一个2小时后再发个试探包。
2、服务器返回一个RST,这表明远程服务器挂了,这时候客户端会关闭连接。
3、如果服务器未响应这个数据包,在大约11分钟后,客户端Socket再发送一个数据包,如果在12分钟内,服务器还没响应,那么客户端Socket将关闭。
注:KEEPLIVE需要操作系统开启此功能。
SO_OOBINLINE
如果这个Socket选项打开,可以通过Socket类的sendUrgentData方法向服务器发送一个单字节的数据。这个单字节数据并不经过输出缓冲区,而是立即发出。虽然在客户端并不是使用OutputStream向服务器发送数据,但在服务端程序中这个单字节的数据是和其它的普通数据混在一起的。因此,在服务端程序中并不知道由客户端发过来的数据是由OutputStream还是由sendUrgentData发过来的。
网友评论