标题: 了解下JAVA的Java收集编程从进门到精晓(18):Socket类的getter和setter办法(2) ... [打印本页] 作者: 灵魂腐蚀 时间: 2015-1-18 11:21 标题: 了解下JAVA的Java收集编程从进门到精晓(18):Socket类的getter和setter办法(2) ... 先谈谈我对java的一些认识。我选择java,是因为他语法简单,功能强大,从web,到桌面,到嵌入式,无所不能。但当我进一步了解了java后,感叹,java原来也有许多缺点。
2、用于取得和设置Socket选项的getter和setter办法
Socket选择能够指定Socket类发送和承受数据的体例。在JDK1.4中共有8个Socket选择能够设置。这8个选项都界说在java.net.SocketOptions接口中。界说以下:
public final static int TCP_NODELAY = 0x0001;
public final static int SO_REUSEADDR = 0x04;
public final static int SO_LINGER = 0x0080;
public final static int SO_TIMEOUT = 0x1006;
public final static int SO_SNDBUF = 0x1001;
public final static int SO_RCVBUF = 0x1002;
public final static int SO_KEEPALIVE = 0x0008;
public final static int SO_OOBINLINE = 0x1003;
风趣的是,这8个选项除第一个没在SO前缀外,其他7个选项都以SO作为前缀。实在这个SO就是SocketOption的缩写;因而,在Java中商定一切以SO为前缀的常量都暗示Socket选项;固然,也有破例,如TCP_NODELAY。在Socket类中为每个选项供应了一对get和set办法,分离用来取得和设置这些选项。
1.TCP_NODELAY
public boolean getTcpNoDelay() throws SocketException
public void setTcpNoDelay(boolean on) throws SocketException
在默许情形下,客户端向服务器发送数据时,会依据数据包的巨细决意是不是当即发送。当数据包中的数据很少时,如只要1个字节,而数据包的头却有几十个字节(IP头+TCP头)时,体系会在发送之前先将较小的包兼并到软年夜的包后,一同将数据发送进来。在发送下一个数据包时,体系会守候服务器对前一个数据包的呼应,当收到服务器的呼应后,再发送下一个数据包,这就是所谓的Nagle算法;在默许情形下,Nagle算法是开启的。
这类算法固然能够无效地改良收集传输的效力,但关于收集速率对照慢,并且对完成性的请求对照高的情形下(如游戏、Telnet等),利用这类体例传输数据会使得客户端有分明的停留征象。因而,最好的办理计划就是必要Nagle算法时就利用它,不必要时就封闭它。而利用setTcpToDelay恰好能够满意这个需求。当利用setTcpNoDelay(true)将Nagle算法封闭后,客户端每发送一次数据,不管数据包的巨细城市将这些数据发送进来。
2.SO_REUSEADDR
public boolean getReuseAddress() throws SocketException
public void setReuseAddress(boolean on) throws SocketException
经由过程这个选项,可使多个Socket对象绑定在统一个端口上。实在如许做并没有多粗心义,但当利用close办法封闭Socket毗连后,Socket对象所绑定的端口其实不必定即刻开释;体系偶然在Socket毗连封闭才会再确认一下是不是有由于提早面未抵达的数据包,这完整是在底层处置的,也就是说对用户是通明的;因而,在利用Socket类时完整不会感到到。
这类处置机制关于随机绑定端口的Socket对象没有甚么影响,但关于绑定在流动端口的Socket对象便可能会抛出“Addressalreadyinuse:JVM_Bind”破例。因而,利用这个选项能够制止个破例的产生。
packagemynet;