ServerSocket的accept()方法从连接请求队列中取出一个客户的连接请求,然后创建与客户连接的Socket对象,并将它返回。如果队列中没有连接请求,accept()方法就会一直等待,直到接收到了连接请求才返回。SO_TIMEOUT选项表示ServerSocket的accept()方法等待客户连接请求的超时时间,以毫秒为单位。如果SO_TIMEOUT的值为0,表示永远不会超时,这是SO_TIMEOUT的默认值。可以通过ServerSocket的setSo- Timeout()方法来设置等待连接请求的超时时间。如果设定了超时时间,那么当服务器等待的时间超过了超时时间后,就会抛出SocketTimeoutException,它是Interrupted- Exception的子类。
许多实际应用要求服务器具有同时为多个客户提供服务的能力。用多个线程来同时为多个客户提供服务,这是提高服务器的并发性能的最常用的手段。本章采用3种方式来重新实现EchoServer,它们都使用了多线程:
(1)为每个客户分配一个工作线程;
(2)创建一个线程池,由其中的工作线程来为客户服务;
(3)利用java.util.concurrent包中现成的线程池,由它的工作线程来为客户服务。
第一种方式需要频繁地创建和销毁线程,如果线程执行的任务本身很简短,那么有可能服务器在创建和销毁线程方面的开销比在实际执行任务上的开销还要大。线程池能很好地避免这一问题。线程池先创建了若干工作线程,每个工作线程执行完一个任务后就会继续执行下一个任务,线程池减少了创建和销毁线程的次数,从而提高了服务器的运行性能。
3.9 练习题
1.关于ServerSocket构造方法的backlog参数,以下哪些说法正确?(多选)
A.backlog参数用来显式设置操作系统中的连接请求队列的长度
B.如果没有设置backlog参数,那么连接请求队列的长度由操作系统决定
C.当一个客户的连接请求被加入到服务器端的连接请求队列中时,就意味着客户端建立了与服务器的连接
D.如果backlog参数的值大于操作系统限定的队列的最大长度,那么backlog参数无效
E.连接请求队列直接由ServerSocket创建并管理
F.ServerSocket的accept()方法从连接请求队列中取出连接请求
2.对于以下程序代码:
ServerSocket serverSocket=new ServerSocket(8000);
serverSocket.setReuseAddress(true);
以下哪个说法正确?(单选)
A.以上代码运行时出错
B.以上代码编译时出错
C.以上代码尽管编译和运行时都不会出错,但对SO_REUSEADDR选项的设置无效
D.以上说法都不正确
3.如何判断一个ServerSocket已经与特定端口绑定,并且还没有被关闭?(单选)
A.boolean isOpen=serverSocket.isBound();
B.boolean isOpen=serverSocket.isBound() && !serverSocket.isClosed();
C.boolean isOpen=serverSocket.isBound() && serverSocket.isConnected();
D.boolean isOpen=!serverSocket.isClosed();
4.ServerSocket与Socket都有一个SO_TIMEOUT选项,它们的作用是否相同?(单选)
A.相同 B.不同
5.服务器端对每个客户都分配一个新的工作线程。当工作线程与客户通信结束时,这个线程就被销毁。这种实现方式有哪些不足?
6.服务器端采用线程池来保证并发响应多个客户的请求,线程池有哪些优缺点?
7.用Java实现一个线程池,线程池在初始状态下没有任何工作线程。当工作队列中有未执行的任务时,分以下两种情况处理:
(1)如果线程池中工作线程数目为MAX_SIZE,那就什么也不做;
(2)如果线程池中工作线程数目小于MAX_SIZE,那么创建一个工作线程,使它执行新任务。
对于线程池中空闲的工作线程,如果其闲置时间超过TIMEOUT秒,就销毁该线程。
8.用Java实现一个采用用户自定义协议的文件传输服务器FileServer和客户FileClient。当FileClient发送请求“GET xxx.xxx”时,FileServer就把xxx.xxx文件发送给FileClient,FileClient把该文件保存到客户端的本地文件系统中;当FileClient发送请求“PUT xxx.xxx”时,FileServer就做好接收xxx.xxx文件的准备,FileClient接着发送xxx.xxx文件的内容,FileServer把接收到的文件内容保存到服务器端的本地文件系统中。GET或PUT命令中的文件允许采用相对路径,其根路径由用户自定义的FILE_PATH系统属性指定。
答案:1.ABDF 2.C 3.B 4.B
(责任编辑 火凤凰 sunsj@51cto.com QQ:34067741 TEL:(010)68476636-8007)
内容导航