设置Socket

来源:互联网 发布:天金加银软件 编辑:程序博客网 时间:2024/05/17 14:27

TCP_NODELAY

setTcpNoDelay(boolean) 立即发送数据。

默认情况下,发送数据采用Negale算法,就是说发送的数据先缓存,等缓存区满了再发送。

如果数据量小且发送持续,Negale算法就不实用了,此时使用上述设置可以关闭socket

的缓冲,直接发送信息,如果Socket的底层实现不支持TCP_NODELAY,在使用时会抛出SocketException

SO_RESUSEADDR

setResueAddress(boolean on) 是否允许重用Socket绑定的本地地址。

接收方通过Socket.close()方法关闭socket时,并不意味着底层的socket立即关闭,如果发送方还有信息输出的话,底层socket会持续接收信息,这是为了避免数据不会被其他恰好绑定到相同端口的心进程接收到。

这样的话底层socket会持续占用端口,如果关闭服务器程序后接着重启程序,会因为端口被占用而启动失败。

确保一个进程关闭Socket后,即使它还没释放端口,同一主机上的其他进程也可以立即重用该端口,可以使用Socket.setResueAddress(true)方法。此方法必须在Socket绑定端口前使用。否则设定无效。

此外公用一个端口的进程不许都调用方法,才能使一个进程关闭Socket后,另一个进程的Socket立刻重用该端口。

SO_TIMEOUT

setSoTimeout(int milliseconds) 设置接收数据的等待超时时间。

这个超时指的是接收的数据为填满缓存区所需要的时间,接收端在没有收到发送端的“信息已经结束”的标志且缓存区不满的情况下,超出超时时间就会抛出超时异常。

超时设置必须在接收数据前执行才有效,如果设置为0,则无超时限制。

SO_LINGER

setSoLinger(boolean on, int seconds) 设置发送消息的底层socket属性

执行Socket.close()方法时,底层Socket并不会立即结束,而是接着将未发送完成的信息(未被对方接收的数据)发送出去。知道发送完所有数据,才算真正关闭socket。

使用该方法可以设置底层socket的关闭特性,可以立即关闭,也可以延时关闭。注意,参数中的时间以秒为单位,而非毫秒。

SO_RCVBUF

setReceiverBufferSize(int size) 输入数据缓存区大小限定。

SO_SNDBUF

setSendBufferSize(int size) 输出数据缓存区大小限定。

SO_KEEPALIVE

setKeepAlive(true) 底层TCP监视连接是否有效。在连接两端没有相互传送数据超过2小时后,本地TCP实现将发送一个数据包给远程Socket,如果远程Socket没有响应,TCP会尝试12分钟,12分钟内未收到响应,就会关闭本地Socket,断开连接。

如果设置为false,就不会去监视连接情况和服务器是否崩溃情况。

OOBINLINE

setOOBInline(true) 表示支持发送(sendUrgentData(int data))一个字节的TCP紧急数据。如果设置为false,接收方收到紧急数据后直接将其丢弃。

注意除非使用更高级协议,否则服务器端是不可能判别普通信息和紧急信息的。

高级选项

setTrafficClass()  使用二进制的与方法来设计TCP传输的侧重点。

0x02 低成本 0x04 高可靠性 0x08最高吞吐量 0x10 最小延时。

这些设置针对不同的服务。

同时setPerformancePreference(int, int, int)方法来设定连接时间,延迟和贷款的相对重要性。

权值越大越重要。

0 0
原创粉丝点击