快速业务通道

Java网络编程从入门到精通(18):Socket类的getter和setter方法(2) - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-21
cket1.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方法(2)(2)

时间:2011-01-12

上面的代码的运行结果如下:

socket1.getReuseAddress():true

error:Address already in use: JVM_Bind

socket2.getReuseAddress():true

端口88第二次绑定成功!

使用SO_REUSEADDR选项时有两点需要注意:

1.必须在调用bind方法之前使用setReuseAddress方法来打开SO_REUSEADDR选项。因此,要想使用SO_REUSEADDR选项,就不能通过Socket类的构造方法来绑定端口。

2.必须将绑定同一个端口的所有的Socket对象的SO_REUSEADDR选项都打开才能起作用。如在例程4-12中,socket1和socket2都使用了setReuseAddress方法打开了各自的SO_REUSEADDR选项。

3.SO_LINGER

public int getSoLinger() throws SocketException

public void setSoLinger(boolean on, int linger) throws SocketException

这个Socket选项可以影响close方法的行为。在默认情况下,当调用close方法后,将立即返回;如果这时仍然有未被送出的数据包,那么这些数据包将被丢弃。如果将linger参数设为一个正整数n时(n的值最大是65,535),在调用close方法后,将最多被阻塞n秒。在这n秒内,系统将尽量将未送出的数据包发送出去;如果超过了n秒,如果还有未发送的数据包,这些数据包将全部被丢弃;而close方法会立即返回。如果将linger设为0,和关闭SO_LINGER选项的作用是一样的。

如果底层的Socket实现不支持SO_LINGER都会抛出SocketException例外。当给linger参数传递负数值时,setSoLinger还会抛出一个IllegalArgumentException例外。可以通过getSoLinger方法得到延迟关闭的时间,如果返回-1,则表明SO_LINGER是关闭的。例如,下面的代码将延迟关闭的时间设为1分钟:

if(socket.getSoLinger() == -1) socket.setSoLinger(true, 60);

4.SO_TIMEOUT

public int getSoTimeout() throws SocketException

public void setSoTimeout(int timeout) throws SocketException

这个Socket选项在前面已经讨论过。可以通过这个选项来设置读取数据超时。当输入流的read方法被阻塞时,如果设置timeout(timeout的单位是毫秒),那么系统在等待了timeout毫秒后会抛出一个InterruptedIOException例外。在抛出例外后,输入流并未关闭,你可以继续通过read方法读取数据。

如果将timeout设为0,就意味着read将会无限等

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号