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

3.8 小结

在EchoServer的构造方法中可以设定3个参数。

·参数port:指定服务器要绑定的端口。

·参数backlog:指定客户连接请求队列的长度。

·参数bindAddr:指定服务器要绑定的IP地址。

ServerSocket的accept()方法从连接请求队列中取出一个客户的连接请求,然后创建与客户连接的Socket对象,并将它返回。如果队列中没有连接请求,accept()方法就会一直等待,直到接收到了连接请求才返回。SO_TIMEOUT选项表示ServerSocket的accept()方法等待客户连接请求的超时时间,以ms为单位。如果SO_TIMEOUT的值为0,则表示永远不会超时,这是SO_TIMEOUT的默认值。可以通过ServerSocket的setSoTimeout()方法来设置等待连接请求的超时时间。如果设定了超时时间,那么当服务器等待的时间超过了超时时间,就会抛出SocketTimeoutException,它是InterruptedException的子类。

许多实际应用要求服务器具有同时为多个客户提供服务的能力。用多个线程来同时为多个客户提供服务,这是提高服务器的并发性能的最常用的手段。本章采用3种方式来重新实现EchoServer,它们都使用了多线程。

(1)为每个客户分配一个工作线程。

(2)创建一个线程池,由其中的工作线程来为客户服务。

(3)利用java.util.concurrent包中的现成的线程池,由它的工作线程来为客户服务。

第1种方式需要频繁地创建和销毁线程,如果线程执行的任务本身很简短,那么有可能服务器在创建和销毁线程方面的开销比在实际执行任务上的开销还要大。线程池能很好地避免这一问题。线程池先创建了若干工作线程,每个工作线程执行完一个任务后就会继续执行下一个任务,线程池减少了创建和销毁线程的次数,从而提高了服务器的运行性能。