快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-24
每个都在它自己的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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

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号