WEB开发网
开发学院软件开发Java Java网络编程从入门到精通(29):服务端Socket的... 阅读

Java网络编程从入门到精通(29):服务端Socket的选项

 2009-09-22 00:00:00 来源:WEB开发网   
核心提示: 执行下面的命令:java server.AcceptTimeout 3000运行结果:accept方法将在3000毫秒后抛出异常!Exceptioninthread"main"java.net.SocketTimeoutException:Accepttimedoutatja

执行下面的命令:

java server.AcceptTimeout 3000

运行结果:

accept方法将在3000毫秒后抛出异常!

Exception in thread "main" java.net.SocketTimeoutException: Accept timed out
    at java.net.PlainSocketImpl.socketAccept(Native Method)
    at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:384)
    at java.net.ServerSocket.implAccept(ServerSocket.java:450)
    at java.net.ServerSocket.accept(ServerSocket.java:421)
    at chapter5.AcceptTimeout.main(AcceptTimeout.java:16)

setSoTimeout方法可以在ServerSocket对象绑定端口之前调用,也以在绑定端口之后调用。如下面的代码也是正确的:

ServerSocket serverSocket = new ServerSocket();
serverSocket.setSoTimeout(3000);
serverSocket.bind(new InetSocketAddress(1234));

二、SO_REUSEADDR选项

SO_REUSEADDR选项决定了一个端口是否可以被绑定多次。可以通过SeverSocket类的两个方法(setReuseAddres和getReuseAddress)来设置和获得SO_TIMEOUT选项的值,这两个方法的定义如下:

public void setReuseAddress(boolean on) throws SocketException 
public boolean getReuseAddress() throws SocketException

在大多数操作系统中都不允许一个端口被多次绑定。如果一个ServerSocket对象绑定了已经被占用的端口,那么ServerSocket的构造方法或bind方法就会抛出一个BindException异常。

Java提供这个选项的主要目的是为了防止由于频繁绑定释放一个固定端口而使系统无法正常工作。当ServerSocket对象关闭后,如果ServerSocket对象中仍然有未处理的数据,那么它所绑定的端口可能在一段时间内不会被释放。这就会造成其他的ServerSocket对象无法绑定这个端口。在设置这个选项时,如果某个端口是第一次被绑定,无需调用setReuseAddress方法,而再次绑定这个端口时,必须使用setReuseAddress方法将这个选项设为true。而且这个方法必须在调用bind方法之前调用。下面的代码演示了如何设置和获得这个选项的值:

上一页  1 2 3 4 5 6  下一页

Tags:Java 网络编程 入门

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接