background image

 

资料来源:北软教育 

www.softedu.org

|专业的java  培训、网络培训、网络安全培训基地

 

 

在客户/服务器通信模式中,服务器端需要创建监听特定端口的 ServerSocket,
ServerSocket 负责接收客户连接请求。本章首先介绍 ServerSocket 类的各个构
造方法,以及成员方法的用法,接着介绍服务器如何用多线程来处理与多个客户
的通信任务。 
本章提供线程池的一种实现方式。线程池包括一个工作队列和若干工作线程。服
务器程序向工作队列中加入与客户通信的任务,工作线程不断从工作队列中取出
任务并执行它。本章还介绍了 java.util.concurrent 包中的线程池类的用法,
在服务器程序中可以直接使用它们。 

3.1   构造 ServerSocket 

ServerSocket 的构造方法有以下几种重载形式: 

l   ServerSocket()throws IOException 
l   ServerSocket(int port) throws IOException 
l   ServerSocket(int port, int backlog) throws IOException 
l   ServerSocket(int port, int backlog, InetAddress bindAddr) throws IOException    

在以上构造方法中,参数 port 指定服务器要绑定的端口(服务器要监听的端口),
参数 backlog 指定客户连接请求队列的长度,参数 bindAddr 指定服务器要绑定
的 IP 地址。 

3.1.1   绑定端口 

除了第一个不带参数的构造方法以外,其他构造方法都会使服务器与特定端口绑定,该端口

由参数

port 指定。例如,以下代码创建了一个与 80 端口绑定的服务器: 

ServerSocket serverSocket=new ServerSocket(80); 
如果运行时无法绑定到

80 端口,以上代码会抛出 IOException,更确切地说,是抛出

BindException,它是 IOException 的子类。BindException 一般是由以下原因造成的: 
l   端口已经被其他服务器进程占用; 
l   在某些操作系统中,如果没有以超级用户的身份来运行服务器程序,那么操作系统不允许
服务器绑定到

1~1023 之间的端口。 

如果把参数 port 设为 0,表示由操作系统来为服务器分配一个任意可用的端口。
由操作系统分配的端口也称为匿名端口。对于多数服务器,会使用明确的端口,
而不会使用匿名端口,因为客户程序需要事先知道服务器的端口,才能方便地访
问服务器。在某些场合,匿名端口有着特殊的用途,本章 3.4 节会对此作介绍。 

3.1.2   设定客户连接请求队列的长度 

当服务器进程运行时,可能会同时监听到多个客户的连接请求。例如,每当一个客户进程执

行以下代码:

 

Socket socket=new Socket(www.javathinker.org,80);

 

就意味着在远程

www.javathinker.org 主机的 80 端口上,监听到了一个客户的连接请求。

管理客户连接请求的任务是由操作系统来完成的。操作系统把这些连接请求存储在一个先进

先出的队列中。许多操作系统限定了队列的最大长度,一般为

50。当队列中的连接请求达

到了队列的最大容量时,服务器进程所在的主机会拒绝新的连接请求。只有当服务器进程通

UnRegister

ed