Java网络编程从入门到精通(18):Socket类的getter和setter办法[Java编程]
本文“Java网络编程从入门到精通(18):Socket类的getter和setter办法[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就是Socket Option的缩写;因此,在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对象便大概会抛出“Address already in use: JVM_Bind”例外.因此,利用这个选项可以避免个例外的发生.
package mynet;
import java.net.*;
import java.io.*;
public class Test
{
public static void main(String[] args)
{
Socket socket1 = new Socket();
Socket socket2 = new Socket();
try
{
socket1.setReuseAddress(true);
socket1.bind(new InetSocketAddress("127.0.0.1", 88));
System.out.println("socket1.getReuseAddress():"
+ socket1.getReuseAddress());
socket2.bind(new InetSocketAddress("127.0.0.1", 88));
}
catch (Exception e)
{
System.out.println("error:" + e.getMessage());
try
{
socket2.setReuseAddress(true);
socket2.bind(new InetSocketAddress("127.0.0.1", 88));
System.out.println("socket2.getReuseAddress():"
+ socket2.getReuseAddress());
System.out.println("端口88第二次绑定成功!");
}
catch (Exception e1)
{
System.out.println(e.getMessage());
}
}
}
}
以上是“Java网络编程从入门到精通(18):Socket类的getter和setter办法[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |