快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-21

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

时间:2011-01-13 BlogJava 银河使者

ServerSocket类有以下三个选项:

1.SO_TIMEOUT: 设置accept方法的超时时间。

2.SO_REUSEADDR:设置服务端同一个端口是否可以多次绑定。

3.SO_RECBUF:设置接收缓冲区的大小。

一、SO_TIMEOUT选项

可以通过SeverSocket类的两个方法(setSoTimeout和getSoTimeout)来设置和获得SO_TIMEOUT选项的值,这两个方法的定义如下:

public synchronized void setSoTimeout(int timeout) throws SocketException public synchronized int getSoTimeout() throws IOException

setSoTimeout方法的timeout参数表示accept方法的超时时间,单位是毫秒。在通常情况下,ServerSocket类的accept方法在等待客户端请求时处于无限等待状态。如HTTP服务器在没有用户访问网页时会一直等待用户的请求。一般不需要对服务端设置等待客户端请求超时,但在某些特殊情况下,服务端规定客户端必须在一定时间内向服务端发出请求,这时就要设置等待客户端请求超时,也就是accept方法的超时时间。当设置客户端请求超时后,accept方法在等待超时时间后抛出一个SocketTimeoutException异常。下面的代码演示了如何设置和获得SO_TIMEOUT选项的值,超时时间通过命令行参数方式传入AcceptTimeout。

package server; import java.net.*; public class AcceptTimeout {      public static void main(String[] args) throws Exception      {          if (args.length == 0)              return;          ServerSocket serverSocket = new ServerSocket(1234);          int timeout = Integer.parseInt(args[0]);          serverSocket.setSoTimeout(Integer.parseInt(args[0]));          System.out.println((timeout > 0) ? "accept方法将在"                  + serverSocket.getSoTimeout() + "毫秒后抛出异常!" : "accept方法永远阻塞!");;          serverSocket.accept();      } }

执行下面的命令:

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));

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

时间:2011-01-13 BlogJava 银河使者

二、SO_REUSEADDR选项

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

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

在大多数操作系统中都

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号