java开发计算机考试服务器_Java网络编程从入门到精通(29):服务端Socket的选项...

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值