java网络编程3、4章习题解析

第三章

  1. 可以操作(A)接口,建立执行流程。
    A Runnable
    B Thread
    C Future
    D Executor

    见下一问

  2. 可以继承(B)类, 定义线程执行流程。
    A. Runnable
    B. Thread
    C. Future
    D. Executor

    解析:1、2题
    java.lang.Thread是Java中定义的线程类
    定义线程的两种方法
    (1)继承Thread类并覆盖它的run()方法;
    public void run( )—线程启动后从这里开始执行,从这里结束
    (2)实现Runnable接口并将Runnable对象传递给Thread构造函数。

  3. 调用Thread的start()后, 线程会处于(B)状态。
    A Running
    B Runnable
    C Wait Blocked
    D IO Blocked

    Runnable(就绪) Wait Blocked(等待阻塞) IO Blocked(线程阻塞)
    在Java当中,线程通常都有五种状态,创建、就绪、运行、阻塞和死亡。
    (1)第一是创建状态。在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态。
    (2)第二是就绪状态。当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。
    (3)第三是运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。
    (4)第四是阻塞状态。线程正在运行的时候,被暂停,通常是为了等待某个时间的发生(比如说某项资源就绪)之后再继续运行。sleep,suspend,wait等方法都可以导致线程阻塞。
    (5)第五是死亡状态。如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪。

  4. 以下(AB)方法会使线程进入阻断状态。
    A. Thread. sleep()
    B. wait()
    C. notify()
    D. interrupt ()

    在这里插入图片描述
    在这里插入图片描述

  5. 如果有以下程序片段:

    public _____ void add (Object 0) {
    	if(next == list.1ength) {
    		list = Arrays.copyOf (list, list.length * 2) ;
    	}
    	list [next++] = o;
    }
    

    为了确保add()在多线程存取下的线程安全,应该加上(B)关键字。
    A abstract
    B synchronized
    C static
    D volatile

    synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种:
    (1)修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;
    (2)修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;
    (3)修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;
    (4)修改一个类,其作用的范围是synchronized后面括号括起来的部分,作用主的对象是这个类的所有对象。
    此题使用synchronized修饰一个方法

第四章

  1. 如果想让Socket对象关闭时,底层Socket未完成发送的数据继续发送,需要设置Socket的哪个选项(C)
    A SO_RESUSEADDR
    B SO_TIMEOUT
    C SO_LINGER
    D SO_SNFBUF

    TCP_NODELAY:表示立即发送数据。
    SO_BINDADDR:指定仅与指定主机通信
    SO_REUSEADDR:表示是否允许重用Socket所绑定的本地地址。值得注意的是socket.setReuseAddress(true)方法必须在Socket还没有绑定到一个本地端口之前调用,否则执行socket.setReuseAddress(true)方法无效。
    SO_TIMEOUT:表示接收数据时的等待超时时间。
    SO_LINGER:表示当执行Socket的close()方法时,是否立即关闭底层的Socket。
    SO_SNFBUF:表示发送数据的缓冲区的大小。
    SO_RCVBUF:表示接收数据的缓冲区的大小。
    SO_KEEPALIVE:表示对于长时间处于空闲状态的Socket,是否要自动把它关闭。SO_KEEPALIVE选项的默认值为false,表示TCP不会监视连接是否有效,不活动的客户端可能会永久存在下去,而不会注意到服务器已经崩溃。
    OOBINLINE:表示是否支持发送一个字节的TCP紧急数据
    IP_TOS:服务类型选项

  2. 当客户端执行以下程序代码时:

    Socket socket=new Socket("angel",80);
    

    如果远程服务器angel不存在,会出现什么情况?(A)
    A 构造方法抛出UnknownHostException异常。
    B 客户端一直等待连接,直到连接超时,从而抛出SocketTimeoutException。
    C 抛出BindException。
    D 构造方法返回一个Socket对象,但它不与任何服务器连接。

    在这里插入图片描述
    UnknownHostException:如果无法识别主机的名字或IP地址,就会抛出这种异常。
    扩展见第11题

  3. 客户程序希望底层网络的IP层提供高可靠性和最小延迟传输服务,客户程序中应该如何提出这一请求(C)?
    A 调用Socket的setPerformancePreferences()方法
    B 设置Socket的SO_SERVICE选项
    C 调用Socket的setTrafficClass()方法
    D 客户程序无法提出这种请求,必须直接配置底层网络

    (1)Socket类中提供了设置和读取IP服务类型的方法:
    设置服务类型:public void setTrafficClass(int trafficClass) throws SocketException
    读取服务类型:public int getTrafficClass() throws SocketException
    (2)public void setPerformancePreferences(int connectionTime,int latency,int bandwidth)
    以上方法的三个参数表示网络传输数据的三项指标:
    参数connectionTime:表示用最少时间建立连接。
    参数latency:表示最小延迟。
    参数bandwidth:表示最高带宽。
    (3)setPerformancePreferences()方法用来设定这三项指标之间的相对重要性。
    可以为这些参数赋予任意的整数,这些整数之间的相对大小就决定了相应参数的相对重要性。
    例如,如果参数connectionTime为2,参数latency为1,而参数bandwidth为3,就表示最高带宽最重要,其次是最少连接时间,最后是最小延迟。

  4. Socket对象的SO_REUSEADDR和TCP_NODELAY选项的默认取值为:(B
    A true, true
    B false, false
    C true, false
    D false, true

    TCP_NODEALY的默认值为false,表示采用Negale算法。
    socket.setReuseAddress(true)方法必须在Socket还没有绑定到一个本地端口之前调用,否则执socket.setReuseAddress(true)方法无效,所以SO_REUSEADDR的默认值为false。
    扩展: SO_KEEPALIVE选项的默认值为false,表示TCP不会监视连接是否有效,不活动的客户端可能会永久存在下去,而不会注意到服务器已经崩溃。

  5. 如何判断一个Socket对象当前是否处于连接状态?
    A boolean isConnected=socket.isConnected() && socket.isBound();
    B boolean isConnected=socket.isConnected() && !socket.isClosed();
    C boolean isConnected=socket.isConnected() && !socket.isBound();
    D boolean isConnected=socket.isConnected();

    Socket类提供了三个状态测试方法:
    (1)isClosed():测试Socket是否已被关闭,注意如果Socket从未建立过连接,isClosed()也返回true;
    (2)isConnected():测试Socket是否建立过连接,注意如果Socket已经连接过连接,且已经被关闭了,isConnected()仍然返回true;
    (3)isBound():如果Socket已经与一个本地端口绑定则返回true;
    要判断一个Socket对象当前是否处于连接状态,可采用以下方式:
    String isConnected=socket.isConnected() && !socket.isClosed();

  6. Socket类的哪个方法返回Socket对象绑定的本地端口?(B
    A getPort()
    B getLocalPort()
    C getRemotePort()
    D 不存在这样的方法,因为Socket对象绑定的本地端口对程序是透明的。

    以下方法用于获取Socket的有关信息:
    getInetAddress():获得远程服务器的IP地址。
    getPort():获得远程服务器的端口。
    getLocalAddress():获得客户本地的IP地址。
    getLocalPort():获得客户本地的端口。
    getRemoteSocketAddress() :远程Socket地址
    getLocalSocketAddress() :本地Socket地址

  7. 以下哪种对象在使用完后不需要关闭(D
    A Thread
    B ExecutorService
    C Socket
    D ByteArrayInputStream

    ByteArrayOutputStream或ByteArrayInputStream是内存读写流,不同于指向硬盘的流,它内部是使用字节数组读内存的,这个字节数组是它的成员变量,当这个数组不再使用变成垃圾的时候,Java的垃圾回收机制会将它回收。

  8. 在网络游戏编程中,为了提高用户之间交互的实时性,应该将Socket对象的以下哪个选项设为true(C
    A SO_LINGER
    B SO_REUSEADDR
    C TCP_NODELAY
    D SO_BROADCAST

    TCP_NODELAY:表示立即发送数据,提高了用户之间交互的实时性。

  9. 以下两段程序代码是否等价?(B

    //第一段程序
    socket.shutdownInput();
    socket.shutdownOutput();
    //第二段程序
    socket.close();
    

    A 等价
    B 不等价

    先后调用Socket的shutdownInput()和shutdownOutput()方法,仅仅关闭了输入流和输出流,不释放Socket占用的包括端口在内的各种资源,所以并不等价于调用 Socket的close()方法。
    在通信结束后,仍然要调用Socket的close()方法,因为只有该方法才会释放Socket占用的资源,比如占用的本地端口等。

  10. 以下哪个Socket选项来用设置Socket接收数据的等待超时时间(B
    A SO_RESUSEADDR
    B SO_TIMEOUT
    C SO_LINGER
    D SO_SNFBUF

    SO_TIMEOUT:表示接收数据时的等待超时时间。

  11. 对于以下程序代码:

    Socket socket=new Socket();  //第1行
    SocketAddress remoteAddr1=new InetSocketAddress("localhost",8000); //第2行
    SocketAddress remoteAddr2=new InetSocketAddress("localhost",8001); //第3行
    socket.connect(remoteAddr1, 60000);  //第4行
    socket.connect(remoteAddr2, 60000);  //第5行
    

    下面哪些说法是正确的?(CDE
    A 以上程序代码可以顺利编译和运行通过。
    B 第1行程序代码创建了一个与本地匿名端口绑定的Socket对象。
    C 第1行程序代码创建的Socket对象没有与任何服务器建立连接,并且没有绑定任何本地端口。
    D 第5行程序代码会运行出错,因为一个Socket对象只允许建立一次连接。
    E 第4行程序代码使Socket对象与一个服务器建立连接,并且绑定一个本地匿名端口。

    Socket类的构造方法很多,只有无参构造方法不会尝试建立连接,其他构造方法,都会尝试建立连接的,如果建立连接失败,将会抛出异常。
    一个Socket对象只允许建立一次连接:在这里插入图片描述
    ConnectException:如果没有服务器进程监听指定的端口,或者服务器进程拒绝连接,就会抛出这种异常。
    扩展:
    当Socket的构造方法请求连接服务器时,可能会抛出以下异常:
    BindException:如果无法把Socket对象与指定的本地IP地址或端口绑定,就会抛出这种异常。
    UnknownHostException:如果无法识别主机的名字或IP地址,就会抛出这种异常。
    ConnectException:如果没有服务器进程监听指定的端口,或者服务器进程拒绝连接,就会抛出这种异常。
    SocketTimeoutException:如果等待连接超时,就会抛出这种异常。
    NoRouteToHostException:路由器无法确定如何将你的包发送到服务器,则要抛出一个这种异常。
    在这里插入图片描述

小结:

  1. 基于TCP协议的Socket允许程序员将网络连接看作是另外一个可以读/写字节的流。Socket对 程序员掩盖了网络的底层细节,如错误检测、包大小、包分解、包重传、网络地址等。
  2. 常见端口
    在这里插入图片描述
  3. Socket的close()方法同时关闭Socket的输入或输出流。
  4. 一个Socket对象中,既包含远程服务器的IP地址和端口信息,也包含本地客户端的IP地址和端口信息。默认情况下,客户端的IP地址来自于客户程序所在的主机,客户端的端口则由操作系统随机分配。
  5. SocketAddress类表示一个连接端点,空的抽象类,除了一个默认构造函数外没有其他方法。
  6. 创建一个未连接的套接字,该套接字通过指定的代理服务器进行连接:public Socket(Proxy proxy)
  7. Whois是RFC 954中定义的简单目录服务协议; 它最初旨在跟踪管理员(负责管理Internet主机和域)。

下一节: java网络编程5、6章习题解析

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值