资料来源:北软教育
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