用Java Socket开发支持上千个并发的小型服务器(下) - 编程入门网
每个都在它自己的Thread中进行。我们在示例中只创建三个Thread,而且一旦服务器运行,这就不能被改变。
用Java Socket开发支持上千个并发的小型服务器(下)(6)时间:2010-04-15处理连接 这里我们实现需作改动的handleConnections()方法,它将委派PooledConnectionHandler处理连接: protected void handleConnection(Socket connectionToHandle) { PooledConnectionHandler.processRequest(connectionToHandle); } 我们现在叫PooledConnectionHandler处理所有进入的连接(processRequest()是一个静态方法)。 创建PooledRemoteFileServer类 1.import java.io.*;2.import java.net.*;3.import java.util.*;4.public class PooledConnectionHandler implements Runnable {5. protected Socket connection;6. protected static List pool = new LinkedList();7. public PooledConnectionHandler() {}8. public void handleConnection() {9. try {10. PrintWriter streamWriter = new PrintWriter(connection.getOutputStream());11. BufferedReader streamReader = new BufferedReader(new InputStreamReader(connection.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. fileReader.close();18. streamWriter.close();19. streamReader.close();20. }21. catch(FileNotFoundException e) {22. System.out.println("");23. }24. catch(IOException e) {25. System.out.println(""+e);26. }27. }28. public static void processRequest(Socket requestToHandle) {29. synchronized(pool) {30. pool.add(pool.size(), requestToHandle);31. pool.notifyAll();32. }33. }34. public void run() {35. while(true) {36. synchronized(pool) {37. while(pool.isEmpty()) {38. try {39. pool.wait();40. }41. catch(InterruptedException e) {42. e.printStackTrace();43. }44. }45. connection= (Socket)pool.remove(0);46. }47. handleConnection();48. }49. }50.} 这个助手类与ConnectionHandler非常相似,但它带有处理连接池的手段。该类有两个实例变量: •connection是当前正在处理的Socket •名为pool的静态LinkedList保存需被处理的连接 填充连接池 这里我们实现PooledConnectionHandler上的processRequest()方法,它将把传入请求添加到池中,并告诉其它正在等待的对象该池已经有一些内容: public static void processRequest(Socket requestToHandle) { synchronized(pool) { pool.add(pool.size(), requestToHandle); pool.notifyAll(); } } synchronized块是个稍微有些不同的东西。您可以同步任何对象上的一个块,而不只是在本身的某个方法中含有该块的对象。在我们的示例中,processRequest()方法包含有一个poo |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |