预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共29页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

在客户/服务器通信模式中,服务器端需要创建监听特定端口的ServerSocket, ServerSocket负责接收客户连接请求。本章首先介绍ServerSocket类的各个构 造方法,以及成员方法的用法,接着介绍服务器如何用多线程来处理与多个客户 的通信任务。 本章提供线程池的一种实现方式。线程池包括一个工作队列和若干工作线程。服 务器程序向工作队列中加入与客户通信的任务,工作线程不断从工作队列中取出 任务并执行它。本章还介绍了java.util.concurrent包中的线程池类的用法, 在服务器程序中可以直接使用它们。 3.1构造ServerSocket ServerSocket的构造方法有以下几种重载形式: lServerSocket()throwsIOException lServerSocket(intport)throwsIOException lServerSocket(intport,intbacklog)throwsIOException lServerSocket(intport,intbacklog,InetAddressbindAddr)throwsIOException 在以上构造方法中,参数port指定服务器要绑定的端口(服务器要监听的端口), 参数backlog指定客户连接请求队列的长度,参数bindAddr指定服务器要绑定 的IP地址。 3.1.1绑定端口 除了第一个不带参数的构造方法以外,其他构造方法都会使服务器与特定端口绑定,该端口 由参数port指定。例如,以下代码创建了一个与80端口绑定的服务器: ServerSocketserverSocket=newServerSocket(80); 如果运行时无法绑定到80端口,以上代码会抛出IOException,更确切地说,是抛出 BindException,它是IOException的子类。BindException一般是由以下原因造成的: l端口已经被其他服务器进程占用; l在某些操作系统中,如果没有以超级用户的身份来运行服务器程序,那么操作系统不允许 服务器绑定到1~1023之间的端口。 如果把参数port设为0,表示由操作系统来为服务器分配一个任意可用的端口。 由操作系统分配的端口也称为匿名端口。对于多数服务器,会使用明确的端口, 而不会使用匿名端口UnRegistered,因为客户程序需要事先知道服务器的端口,才能方便地访 问服务器。在某些场合,匿名端口有着特殊的用途,本章3.4节会对此作介绍。 3.1.2设定客户连接请求队列的长度 当服务器进程运行时,可能会同时监听到多个客户的连接请求。例如,每当一个客户进程执 行以下代码: Socketsocket=newSocket(www.javathinker.org,80); 就意味着在远程www.javathinker.org主机的80端口上,监听到了一个客户的连接请求。 管理客户连接请求的任务是由操作系统来完成的。操作系统把这些连接请求存储在一个先进 先出的队列中。许多操作系统限定了队列的最大长度,一般为50。当队列中的连接请求达 到了队列的最大容量时,服务器进程所在的主机会拒绝新的连接请求。只有当服务器进程通 资料来源:北软教育www.softedu.org|专业的java培训、网络培训、网络安全培训基地 过ServerSocket的accept()方法从队列中取出连接请求,使队列腾出空位时,队列才能继 续加入新的连接请求。 对于客户进程,如果它发出的连接请求被加入到服务器的队列中,就意味着客户 与服务器的连接建立成功,客户进程从Socket构造方法中正常返回。如果客户 进程发出的连接请求被服务器拒绝,Socket构造方法就会抛出 ConnectionException。 ServerSocket构造方法的backlog参数用来显式设置连接请求队列的长度,它 将覆盖操作系统限定的队列的最大长度。值得注意的是,在以下几种情况中,仍 然会采用操作系统限定的队列的最大长度: lbacklog参数的值大于操作系统限定的队列的最大长度; lbacklog参数的值小于或等于0; l在ServerSocket构造方法中没有设置backlog参数。 以下例程3-1的Client.java和例程3-2的Server.java用来演示服务器的连接 请求队列的特性。 例程3-1Client.java importjava.net.*; publicclassClient{ publicstaticvoidmain(Stringargs[])throwsException{ finalintlength=100; Stringhost="localhost"; intport=8000;