Java后台服务程序设计_第1页
Java后台服务程序设计_第2页
Java后台服务程序设计_第3页
Java后台服务程序设计_第4页
Java后台服务程序设计_第5页
已阅读5页,还剩11页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Java后台服务程序设计在很多大型软件项目中,都有一些极为重要的后台服务程序,它们并不处理具体的系统业务逻辑,但对整个系统资源和服务的协调管理却是不可或缺。本文讨论如何完整地编写一个后台服务管理程序,并通过一个具体的后台服务管理例子来说明这 一技术实现的技巧。为什么需要后台服务程序?在许多大型软件项目中,后台服务程序都扮演着极为重要的角色。它们无处不在,例如操作系统的内 核程序处理各种对操作系统的内部调用;数据库系统的核心管理进程处理各种对数据库的读写操作和 进程、资源的管理;大型 ERP软件的内核管理程序要完成各种应用模块的资源、通讯管理等等。它 们使系统的各种服务、资源与应用的表示之间形成

2、了一个松耦合关系,这样就极大地增加了软件系统的稳定性和伸缩性。后台服务程序也就是相当于软件系统的管理调度中心,它是软件系统的中央处理器,是保证应用高效运行的内核程序。在不同的软件系统中,由于软件的复杂程度和功能的不同使得各种软件系统的后台服务程序都有存在 较大的差异。但是后台服务程序还是有很多共同的特点,一个基本的后台服务程序大概可以由四个部分构成:通用服务器框架、服务与监听、服务控制、服务器实现。下面我们就使用具体的代码来实现 一个基本的后台服务器程序。通用服务器框架在开发后台服务程序中,我们首先实现一个通用服务器框架类,它能在多个端口提供多线程的服务(由 多个Service对象定义),并且

3、能够在系统运行时动态地调用和实例化Service类并加载新的服务或卸除已加载的服务。清单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 l

4、og = new PrintWriter(System.out, true);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) P

5、ort = proPort;Num = proNum;public Server(int maxConn) this.maxConnections = maxConn;this.freeConn=maxConnections;this.threadGroup = new ThreadGroup(Server.class.getName();currentConn = 0;this.services = new HashMap();this.connections = new HashSet(maxConnections);public synchronized void add

6、Service(Service service,int port, int maxConn)throws IOException String servicename = service.getClass().getName();Integer key = new Integer(port);if (services.get(key) != null) throw new lllegalArgumentException(”+ port + 已经被占用! ”);if (getfreeConnections(maxConn)=0) Listener listener = new Listener

7、(this, port, service, maxConn);services.put(key,listener);log.println(启动+ servicename + 服务在+ port + 端口上);listener.start(); else System.err.println(”系统并发连接限制已经达到最大值);System.err.println(”服务+ servicename + 启动失败!);public synchronized void addService(Service service,int port) throws lOException this.addS

8、ervice(service,port,10);public synchronized boolean removeService(int port) Integer key = new Integer(port);int maxConn =10;final Listener listener = (Listener) services.get(key);if (listener = null) log.println(Service + isnt started on port + port);return false;services.remove(key);listener.please

9、Stop();freeConn+=listener.maxConn;log.println(Close + listener.service + on port + port);return true;public synchronized void displayStatus(PrintWriter out) Iterator keys = services.keySet().iterator();while (keys.hasNext() Integer port = (Integer) keys.next();Listener listener = (Listener) services

10、.get(port);out.println(服务+ listener.service + 运行+ port + n);out.println(连接限制为+ maxConnections);Iterator conns = connections.iterator();while (conns.hasNext() Socket s = (Socket) conns.next();int sport = s.getLocalPort();Listener listen = (Listener) services.get(new Integer(sport);String servicename

11、= listen.service;out.println(servicename + 响应请求在 +s.getlnetAddress().getHostAddress() + 的+ sport + 端口上);out.println(”当前连接数为+ currentConn);out.println(”当前系统空闲连接数为 + freeConn);private synchronized int getfreeConnections(int maxConn) int num = -1;if (freeConn = maxConn) freeConn-=maxConn;num = freeConn

12、;return num;public synchronized int getConnections() return currentConn;public synchronized int addConnections(Socket s) connections.add(s);return currentConn+;public synchronized int removeConnections(Socket s) connections.remove(s);try s.close(); catch (Exception e) System.out.println(e.getMessage

13、();return currentConn-;public synchronized int getConnections(int connections) int num = 0;if (num=freeConn-connections) = 0) freeConn = num; else num = -1;return num;private synchronized int getFreeConn() return freeConn;如上所述可知,服务器框架类Server主要是通过端口到监听器影射的散列表services来管理服务对象,Server类的几个主要方法说明如下: addSer

14、vice方法:此方法能够在特定的端口上创建新的服务,即在指定端口上运行指定的Service 对象。 removeService方法:此方法使服务器停止指定端口上的服务,并不终止连接,仅使服务器 停止接受新的连接。* displaystatus方法:此方法用于打印指定流上服务器的状态信息。服务与监听每个服务都对应着一个监听对象,监听指定端口的连接并在获得连接请求时调用 addConnection( Socket s, Service service )方法来取得(释放)一个连接。清单2显示了如何编制一个监听类文件。【清单2 : Listener.java 的一个简单实现】import java.

15、util.*;import java.io.*;import .*;public class Listener extends Thread private ServerSocket listener;private int port;String service;Set connections;private Service runService;private boolean stop_flag = false;int maxConn;private PrintWriter log = new PrintWriter(System.err, true);private ThreadGrou

16、p group;private int currentConnections = 0;Server server;Socket client = null;public Listener(Serverserver, int port, Service service, int maxConn, booleanbl) throws IOException this.server = server;this.port = port;this.service = service.getClass().getName(); this.maxConn = maxConn;this.group = ser

17、ver.threadGroup; this.connections = server.connections;listener = new ServerSocket(this.port);if (bl = false) listener.setSoTimeout(600000); this.runService = service;if (!stop_flag) for (int i=0;i);to_client.flush();String line;while (line=from_client.readLine()!=null) int len = line.indexOf(Remote

18、 Console);line = line.substring(len+1,line .l ength();String printStr;try StringTokenizer st = new StringTokenizer(line);int count = st.countTokens();if (!st.hasMoreElements() continue;String first = st.nextToken().toLowerCase();if (first.equals(password) String pwd = st.nextToken();if (pwd.equals(t

19、his.password) to_client.println(OK);authorized = true; else to_client.println(密码无效,请重试! n); else if (first.equals(add) 请登陆! n);if(!authorized) to_client.println( else count-;String servicename;int Port;boolean flag = true;if (count0) servicename = st.nextToken();Port = lnteger.parselnt(st.nextToken(

20、);server.addService(loadClass(servicename1), Port);to_client.println(服务+ servicename + 已经加载n);flag = false;if (flag) to_client.println(系统不能启动非法服务:”+servicename);else to_client.println(请输入服务名!n); else if (first.equals(remove) if(!authorized) to_client.println( else 请登陆!n);count-;if (count0) int port

21、= Integer.parseInt(st.nextToken();boolean bl = server.removeService(port);if (bl) to_client.println(端口 : + port+上的服务已经卸载n);else to_client.println(端口 : + port +上无任何服务运行,卸载操作失败! n); else to_client.println(请输入端口名!n); else if(first.equals(status) if(!authorized) to_client.println(else server.displayStat

22、us(to_client);请登陆!n); else if(first.equals(help) if(!authorized) to_client.println(请登陆!n);else printHelp(to_client); else if(first.equals(quit) break;else to_client.println(”命令不能识别!n);catch(Exception e) to_client.println(系统后台出错+ e.getMessage()+n);printHelp(to_client);to_client.println(Remote Console

23、);to_client.flush();to_client.flush();authorized = false;server.removeControlFlag();to_client.close();from_client.close();private void printHelp(PrintWriter out) out.println(COMMANDS: +tpassword n +ttadd n +ttremove n +ttstatusn +tthelpn +ttquitn);protected Service loadClass(String servicename) Serv

24、ice s = null;try Class serviceClass = Class.forName(servicename);s = (Service) serviceClass.newInstance(); catch (Exception e) return s;服务器实现和运行服务器实现主要完成服务器的初始化,启动服务控制实例等工作,代码如清单6所示:【清单 6 : runServer.java的一个简单实现】import java.util.*;public class runServer public runServer() public static void main(Str

25、ing args) try int argLen = args .1 ength;System.out.println(正在初始化系统请等待);System.out.println();int maxConn = 30;Server server = new Server(maxConn);System.out.println(#);#);#);#);System.out.println(#System.out.println(#System.out.println(#System.out.println(#); System.out.println();if (argLen2) for (int i = 0;iargLen;i+) if (argsi.equals(-s) i+;String password = argsi;i+;int port = lnteger.parselnt(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论