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

在线预览结束,喜欢就下载吧,查找使用更方便

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

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

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

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

杭州java软件培训www.zjbenet.com 杭州网络营销培训www.hzbeidaqingniao.com 一个多线程的示例1.介绍前面的示例教给您基础知识,但并不能令您更深入。如果您到此就停止了,那么您一次只能处理一台客户机。原因是handleConnection()是一个阻塞方法。只有当它完成了对当前连接的处理时,服务器才能接受另一个客户机。在多数时候,您将需要(也有必要)一个多线程服务器。要开始同时处理多台客户机,并不需要对RemoteFileServer作太多改变。事实上,要是我们前面讨论过待发(backlog),那我们就只需改变一个方法,虽然我们将需要创建一些新东西来处理进入的连接。这里我们还将向您展示ServerSocket如何处理众多等待(备份)使用服务器的客户机。本示例对线程的低效使用,所以请耐心点。2.接受(太多)连接这里我们实现改动过的acceptConnections()方法,它将创建一个能够处理待发请求的ServerSocket,并告诉ServerSocket接受连接: Java代码 publicvoidacceptConnections(){ try{ ServerSocketserver=newServerSocket(listenPort,5); SocketincomingConnection=null; while(true){ incomingConnection=server.accept(); handleConnection(incomingConnection); } }catch(BindExceptione){ System.out.println("Unabletobindtoport"+listenPort); }catch(IOExceptione){ System.out.println("UnabletoinstantiateaServerSocketonport:"+listenPort); } } 新的server仍然需要acceptConnections(),所以这些代码实际上是一样的。突出显示的行表示一个重大的不同。对这个多线程版,我们现在可以指定客户机请求的最大数目,这些请求都能在实例化ServerSocket期间处于待发状态。如果我们没有指定客户机请求的最大数目,则我们假设使用缺省值50。这里是它的工作机制。假设我们指定待发数(backlog值)是5并且有五台客户机请求连接到我们的服务器。我们的服务器将着手处理第一个连接,但处理该连接需要很长时间。由于我们的待发值是5,所以我们一次可以放五个请求到队列中。我们正在处理一个,所以这意味着还有其它五个正在等待。等待的和正在处理的一共有六个。当我们的服务器仍忙于接受一号连接(记住队列中还有2―6号)时,如果有第七个客户机提出连接申请,那么,该第七个客户机将遭到拒绝。我们将在带有连接池服务器示例中说明如何限定能同时连接的客户机数目。3.处理连接:第1部分这里我们将讨论handleConnection()方法的结构,这个方法生成一个新的Thread来处理每个连接。我们将分两部分讨论这个问题。这一屏我们将着重该方法本身,然后在下一屏研究该方法所使用的ConnectionHandler助手类的结构。 Java代码 publicvoidhandleConnection(SocketconnectionToHandle){ newThread(newConnectionHandler(connectionToHandle)).start(); } 我们对RemoteFileServer所做的大改动就体现在这个方法上。我们仍然在服务器接受一个连接之后调用handleConnection(),但现在我们把该Socket传递给ConnectionHandler的一个实例,它是Runnable的。我们用ConnectionHandler创建一个新Thread并启动它。ConnectionHandler的run()方法包含Socket读/写和读File的代码,这些代码原来在RemoteFileServer的handleConnection()中。4.处理连接:第2部分这里是ConnectionHandler类的结构: Java代码 importjava.io.*; importjava.net.*; publicclassConnectionHandlerimplementsRunnable{ SocketsocketToHandle; publicConnectionHandler(SocketaSocketToHandle){ socketToHandle=aSocketToHandle; } publicvoidru