快速业务通道

用Java Socket开发支持上千个并发的小型服务器(下) - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-24
了Runnable接口。实现这个接口的类都必须实现run()方法。这里我们实现run()方法,它将攫取我们的连接的流,用它来读写该连接,并在任务完成之后关闭它。ConnectionHandler的run()方法所做的事情就是RemoteFileServer上的handleConnection()所做的事情。首先,我们把InputStream和OutputStream分别包装(用Socket的getOutputStream()和getInputStream())进BufferedReader和PrintWriter。然后我们用这些代码逐行地读目标文件:

1.PrintWriter streamWriter = new PrintWriter(socketToHandle.getOutputStream());2.            BufferedReader streamReader = new BufferedReader(new InputStreamReader(socketToHandle.getInputStream()));3.            String fileToRead = streamReader.readLine();4.            BufferedReader fileReader = new BufferedReader(new FileReader(fileToRead));5.            String line =null;6.            while((line=fileReader.readLine())!=null) {7.                streamWriter.println(line);8.            }

请记住我们应该从客户机获取一条有效的文件路径,这样用该路径名构造一个新File,把它包装进FileReader以处理读文件的操作,然后把它包装进BufferedReader以让我们逐行地读该文件。我们while循环中调用BufferedReader上的readLine()直到不再有要读的行。请记注,对readLine()的调用将造成阻塞,直到有字节来到为止。我们获取一些字节之后就把它们放到本地的line变量中,然后写出到客户机上。完成读写操作之后,我们关闭打开的流。

总结一下多线程服务器

让我们回顾一下创建和使用“多线程版”的服务器的步骤:

1.修改acceptConnections()以用缺省为50(或任何您想要的大于1的指定数字)实例化ServerSocket。

2.修改ServerSocket的handleConnection()以用ConnectionHandler的一个实例生成一个新的Thread。

3.借用RemoteFileServer的handleConnection()方法的代码实现ConnectionHandler类。

用Java Socket开发支持上千个并发的小型服务器(下)(5)

时间:2010-04-15

7 创建带有连接池的Socket服务器

我们现在已经拥有的MultithreadedServer每当有客户机申请一个连接时都在一个新Thread中创建一个新ConnectionHandler。这意味着可能有一捆Thread“躺”在我们周围。而且创建Thread的系统开销并不是微不足道的。如果性能成为了问题(也请不要事到临头才意识到它),更高效地处理我们的服务器是件好事。那么,我们如何更高效地管理服务器端呢?我们可以维护一个进入的连接池,一定数量的ConnectionHandler将为它提供服务。这种设计能带来以下好处:

•它限定了允许同时连接的数目。

•我们只需启动ConnectionHandler Thread一次。

幸运的是,跟在我们的多线程示例中一样,往代码中添加“池”不需要来一个大改动。事实上,应用程序的客户机端根本就不受影响。在服务器端,我们在服务器启动时创建一定数量的ConnectionHandler,我们把进入的连接放入“池”中并让ConnectionHandler打理剩下的事情。这种设计中有很多我们不打算讨论的可能存在的技巧。例如,我们可以通过限定允许在“池”中建立的连接的数目来拒绝客户机。

请注意:我们将不会再次讨论acceptConnections()。这个方法跟前面示例中的完全一样。它无限循环地调用ServerSocket上的accept()并把连接传递到handleConnection()。

创建PooledRemoteFileServer类

1.import java.io.*;2.import java.net.*;3.import java.util.*;4.public class PooledRemoteFileServer {5.    protected int maxConnections;6.    protected int listenPort;7

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号