1、清单 1显示了如何编制一个通用服务器框架类文件。【清单 1:通用服务器框架类文件Server.java】import java.util.*;import java.io.*;import .*;public class Server protected Map services; Set connections; int maxConnections; int freeConn; ThreadGroup threadGroup; private int currentConn; private PrintWriter log = new PrintWriter(System.out, tru
2、e); public boolean connected = false; public Properties proPort, proNum; public synchronized void setControlFlag() connected = true; public synchronized void removeControlFlag() connected = false; public void setProperty(Properties proPort, Properties proNum) this.proPort = proPort; this.proNum = pr
3、oNum; public Server(int maxConn) this.maxConnections = maxConn; this.freeConn=maxConnections; this.threadGroup = new ThreadGroup(; currentConn = 0; this.services = new HashMap(); this.connections = new HashSet(maxConnections); public synchronized void addService(Service service,int port, int maxConn
4、) throws IOException String servicename = service.getClass().getName(); Integer key = new Integer(port); if (services.get(key) != null) throw new IllegalArgumentException(端口: + port + 已经被占用!); if (getfreeConnections(maxConn)=0) Listener listener = new Listener(this, port, service, maxConn); services
5、.put(key,listener); log.println(启动 + servicename + 服务在 + port +端口上 listener.start(); else 系统并发连接限制已经达到最大值!服务 启动失败! public synchronized void addService(Service service,int port) throws IOException this.addService(service,port,10); public synchronized boolean removeService(int port) int maxConn =10; f
6、inal Listener listener = (Listener) services.get(key); if (listener = null) Service + isnt started on port + port); return false; services.remove(key); listener.pleaseStop(); freeConn+=listener.maxConn;Close + listener.service + on port return true; public synchronized void displayStatus(PrintWriter
7、 out) Iterator keys = services.keySet().iterator(); while (keys.hasNext() Integer port = (Integer) keys.next(); Listener listener = (Listener) services.get(port); out.println(运行n连接限制为 + maxConnections); Iterator conns = connections.iterator(); while (conns.hasNext() Socket s = (Socket) conns.next();
8、 int sport = s.getLocalPort(); Listener listen = (Listener) services.get(new Integer(sport); String servicename = listen.service; out.println(servicename + 响应请求在 + s.getInetAddress().getHostAddress() + 的 + sport + 当前连接数为 + currentConn);当前系统空闲连接数为 + freeConn); private synchronized int getfreeConnecti
9、ons(int maxConn) int num = -1; if (freeConn = maxConn) freeConn-=maxConn; num = freeConn; return num; public synchronized int getConnections() return currentConn; public synchronized int addConnections(Socket s) connections.add(s); return currentConn+; public synchronized int removeConnections(Socke
10、t s) connections.remove(s); try s.close(); catch (Exception e) ; return currentConn-; public synchronized int getConnections(int connections) int num = 0; if (num=freeConn-connections) = 0) freeConn = num; else num = -1; private synchronized int getFreeConn() return freeConn;如上所述可知,服务器框架类Server主要是通过
11、端口到监听器影射的散列表services来管理服务对象,Server类的几个主要方法说明如下: addService方法:此方法能够在特定的端口上创建新的服务,即在指定端口上运行指定的Service对象。 removeService方法:此方法使服务器停止指定端口上的服务,并不终止连接,仅使服务器停止接受新的连接。 displayStatus方法:此方法用于打印指定流上服务器的状态信息。服务与监听 每个服务都对应着一个监听对象,监听指定端口的连接并在获得连接请求时调用addConnection(Socket s, Service service)方法来取得(释放)一个连接。清单 2显示了如何编
12、制一个监听类文件。【清单 2:Listener.java的一个简单实现】public class Listener extends Thread private ServerSocket listener; private int port; String service; private Service runService; private boolean stop_flag = false; int maxConn; private PrintWriter log = new PrintWriter(System.err, true); private ThreadGroup group; private int currentConnection