用Java Socket开发支持上千个并发的小型服务器(下) - 编程入门网
ad(new ConnectionHandler(connectionToHandle)).start();28. }29. public static void main(String args[]) {30. MultithreadedRemoteFileServer server = new MultithreadedRemoteFileServer(1001);31. server.acceptConnections();32. }33.}
这里我们实现改动过acceptConnections()方法,它将创建一个能够处理待发请求的ServerSocket,并告诉ServerSocket接受连接。 新的server仍然需要acceptConnections(),所以这些代码实际上是一样的。突出显示的行表示一个重大的不同。对这个多线程版,我们现在可以指定客户机请求的最大数目,这些请求都能在实例化ServerSocket期间处于待发状态。如果我们没有指定客户机请求的最大数目,则我们假设使用缺省值50。 这里是它的工作机制。假设我们指定待发数(backlog值)是5并且有五台客户机请求连接到我们的服务器。我们的服务器将着手处理第一个连接,但处理该连接需要很长时间。由于我们的待发值是5,所以我们一次可以放五个请求到队列中。我们正在处理一个,所以这意味着还有其它五个正在等待。等待的和正在处理的一共有六个。当我们的服务器仍忙于接受一号连接(记住队列中还有2?6号)时,如果有第七个客户机提出连接申请,那么,该第七个客户机将遭到拒绝。我们将在带有连接池服务器示例中说明如何限定能同时连接的客户机数目。 处理连接: public void handleConnection(Socket connectionToHandle) { new Thread(new ConnectionHandler(connectionToHandle)).start(); } 用Java Socket开发支持上千个并发的小型服务器(下)(4)时间:2010-04-15我们对RemoteFileServer所做的大改动就体现在这个方法上。我们仍然在服务器接受一个连接之后调用handleConnection(),但现在我们把该Socket传递给ConnectionHandler的一个实例,它是Runnable的。我们用ConnectionHandler创建一个新Thread并启动它。ConnectionHandler的run()方法包Socket读/写和读File的代码,这些代码原来在RemoteFileServer的handleConnection()中。 创建ConnectionHandler类 1.import java.io.*;2.import java.net.*;3.public class ConnectionHandler implements Runnable {4. protected Socket socketToHandle;5. public ConnectionHandler(Socket socketToHandle) {6. this.socketToHandle=socketToHandle;7. }8. public void run() {9. try {10. PrintWriter streamWriter = new PrintWriter(socketToHandle.getOutputStream());11. BufferedReader streamReader = new BufferedReader(new InputStreamReader(socketToHandle.getInputStream()));12. String fileToRead = streamReader.readLine();13. BufferedReader fileReader = new BufferedReader(new FileReader(fileToRead));14. String line =null;15. while((line=fileReader.readLine())!=null) {16. streamWriter.println(line);17. }18. fileReader.close();19. streamWriter.close();20. streamReader.close();21. }22. catch(Exception e) {23. System.out.println("Error handling a client: "+e);24. e.printStackTrace();25. }26. }27.} 这个助手类相当简单。跟我们到目前为止的其它类一样,我们导入java.net和java.io。该类只有一个实例变量socketToHandle,它保存由该实例处理的Socket。 类的构造器用一个Socket实例作参数并将它赋给socketToHandle。 请注意该类实现 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |