Java网络编程核心技术详解(视频微课版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.9 练习题

1.关于ServerSocket构造方法的backlog参数,以下哪些说法正确?(多选)

a)backlog参数用来显式地设置操作系统中的连接请求队列的长度。

b)如果没有设置backlog参数,那么连接请求队列的长度由操作系统决定。

c)当一个客户的连接请求被加入服务器端的连接请求队列,就意味着建立了客户端与服务器的连接。

d)如果backlog参数的值大于操作系统限定的队列的最大长度,那么backlog参数无效。

e)连接请求队列直接由ServerSocket创建并管理。

f)ServerSocket的accept()方法从连接请求队列中取出连接请求。

2.对于以下程序代码:

以下哪个说法正确?(单选)

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实现一个采用用户自定义协议的文件传输服务器程序exercise.FileServer类和客户程序exercise.FileClient类。

当FileClient发送请求“get”,FileServer就把server/demofile.txt文件发送给FileClient,FileClient把该文件保存到客户端的本地文件系统的client/demofile.txt中。

当FileClient发送请求“put”,FileServer就做好接收demofile.txt文件的准备,FileClient接着发送client/demofile.txt文件的内容,FileServer把接收到的文件数据保存到服务器端的本地文件系统的server/demofile.txt中。

当FileClient发送请求“bye”,就结束与FileServer的通信。

答案:1.a,b,c,d,f 2.c 3.b 4.b

5.频繁地创建和销毁工作线程,会消耗系统资源,影响服务器程序的运行性能。

6.线程池事先创建了一些工作线程,这些工作线程可以被重复使用,为多个客户服务。而且线程池会灵活控制工作线程的数目。线程池能有效利用系统资源,保证工作线程的数目与客户端的并发请求的数目以及系统的承载负荷能力匹配。

7.参见配套源代码包的sourcecode/chapter03/exercise目录下的FileServer.java和FileClient.java

编程提示:客户端每次发送请求时,都是先发送一个int类型的数据,指定具体请求数据的长度(以字节为单位)。这样可以确保服务器端方便地读取指定长度的请求数据。

先运行FileServer,再运行FileClient。FileClient的运行结果如图3-5所示。

图3-5 FileClient类的运行结果