含有许多JAVA的技巧!

源代码在线查看: 如何规划您的大型java多并发服务器程序.txt

软件大小: 519 K
上传用户: supertruman
关键词: JAVA
下载地址: 免注册下载 普通下载 VIP

相关代码

				如何规划您的大型JAVA多并发服务器程序 
				(加入日期:2003-4-12 点击数:1864)
				【对此文发表评论】 【编程爱好者论坛】 【保存文章至硬盘】 【打印文章】 
				 
				作者: 陈林茂  
				
				  JAVA 自从问世以来,越来越多的大型服务器程序都采用它进行开发,主要是看中
				
				它的稳定性及安全性,但对于一个新手来说,您又如何开发您的JAVA 应用服务器,
				
				同时又如何规划您的JAVA服务器程序,并且很好的控制您的应用服务器开发的进度,
				
				最后,您又如何发布您的JAVA 应用服务器呢?(由于很多前辈已有不错的著作,我
				
				只能在这里画画瓢,不足指出,请多来信指正,晚辈将虚心接受!本人的联系方式:
				
				linmaochen@sohu.com)
				
				
				废话少说,下面转入正题:
				
				本文将分以下几个部分来阐述我的方法:
				
				  1、 怎样分析服务器的需求?
				  
				  2、 怎样规划服务器的架构?
				
				  3、 怎样规划服务器的目录及命名规范、开发代号?
				
				  4、 原型的开发(-):  怎样设计服务器的代码骨架?
				
				  5、 原型的开发(二): 怎样测试您的代码骨架?
				
				  6、 详细的编码?
				
				  7、 如何发布您的JAVA 服务器产品?
				
				
				一、 如何分析服务器的需求?
				
				   我的观点是:
				   
				   1。服务器就像一台轧汁机,进去的是一根根的甘蔗,出来的是一杯杯的甘蔗汁;
				
				   也就是说,在开发服务器之前,先要明白,服务器的请求是什么?原始数据是什么?
				
				   接下来要弄明白,希望得到的结果是什么? 结果数据应该怎样来表述?
				
				   其实要考虑的很多,无法一一列出(略)。
				
				
				二、如何规划服务器的架构?
				
				   首先问大家一个小小的问题:在上海的大都市里,公路上的公交客车大致可以分为以下两类:
				
				   空调客车,票价一般为两块,上车不需要排队,能否坐上座位,就要看个人的综合能力;
				
				   无人售票车,票价一般1 块和一块五毛,上车前需要规规矩矩排队,当然,座位是每个人都有的。
				
				   那么,我的问题是,哪类车的秩序好呢?而且上下车的速度快呢?答案是肯定的: 无人售票车。
				
				
				   所以,我一般设计服务器的架构主要为:
				
				      首先需要有一个请求队列,负责接收客户端的请求,同时它也应有一个请求处理机制,说到实际
				    
				     上,应有一个处理的接口;
				
				      其次应该有一个输出队列,负责收集已处理好的请求,并准备好对应的回答;当然,它也有一个
				
				     回答机制,即如何将结果信息发送给客户端;
				
				
				      大家都知道,服务器程序没有日志是不行的,那么,服务器同时需要有一个日志队列,负责整个服
				
				     务器的日志信息收集和处理;
				
				
				     最后说一点,上公交车是需要有钞票的,所以,服务器同样需要有一个验证机制。
				
				      ...(要说的东西实在太多,只好略)
				
				
				三、 怎样规划服务器的目录及命名规范、开发代号
				
				    对于一般的大型服务器程序,应该有下面几个目录:
				
				    bin :  主要存放服务器的可执行二进制文件;
				    
				    common: 存放JAVA程序执行需要的支持类库;
				
				    conf  : 存放服务器程序的配置文件信息;
				
				    logs  : 存放服务器的日志信息;
				
				    temp  : 存放服务器运行当中产生的一些临时文件信息;
				
				    cache : 存放服务器运行当中产生的一些缓冲文件;
				
				    src   : 当然是存放服务器的JAVA源程序啦。
				
				    ......(其他的设定,根据具体需求。)
				  
				
				四、原型的开发(-):  怎样设计服务器的代码骨架?
				
				
				    1。首先服务器程序需要有一个启动类,我们不妨以服务器的名字命名:(ServerName).class    
				
				    2。服务器需要有一个掌控全局的线程,姑且以:(MainThread.class)命名;
				
				    3。注意不论是短连接和长连接,每一个客户端需要有一个线程给看着,以 ClientThread.class 命名 
				
				    4。请求队列同样需要以线程的方式来表现: (InputQuene.Class),对应的线程处理类以InputProcessThread.class
				
				       命名;
				
				    5。输出队列也需要一个线程:(OutputQuene.Class),对应的处理机制以OutputProcessThread.class 命名;
				
				    6。日志队列也是需要一个线程的,我们以 logQuene.class,logQueneThread.Class 来命名;
				
				    7。缓冲区的清理同样需要定时工作的,我们以CacheThread.Class 来命名;
				
				    8. 如果您的参数信息是以XML的方式来表达的话,那么我也建议用一个单独的类来管理这些参数信息:
				
				      Config.Class
				
				    9. 当然,如果您想做得更细一点的话,不妨将客户端客服务器端的通讯部分也以接口的形式做出来:
				   
				       CommInterface.Class
				
				    ......(太多,只能有空再说!)     
				
				
				五、 原型的开发(二): 怎样测试您的代码骨架?
				
				     下面为原型的骨架代码,希望大家多多提点意见!谢啦!
				
				/* 服务器描述 : 服务器主控线程
				1。读取组态文件信息
				2。建立需求输入队列
				3。建立需求处理输出队列
				4。建立需求处理线程
				5。建立输出预处理线程,进行需求处理结果的预处理
				6. 建立缓冲区管理线程,开始对缓冲取进行管理
				7。建立服务连接套捷字,接受客户的连接请求,并建立客户连接处理线程
				*/
				
				import java.io.*;
				import java.net.*;
				import java.util.*;
				
				
				public class mainThread extends Thread {
				
				  
				  private ServerSocket serverSocket=null;
				
				  /*当前服务器监听的端口*/
				  private int serverPort;
				
				  public mainThread(String ConfUrl) {
				   try{
				      
				      /*建立服务器监听套接字*/
				      this.serverSocket =new ServerSocket(serverPort);
				
				    }catch(Exception e){
				      //
				      System.out.println(e.getMessage());
				    }
				
				  }
				
				  /*线程的执行绪*/
				  public synchronized void run(){
				
				    while(listening){
				      try{
				
				         Socket sersocket =this.serverSocket.accept();
				         
				         ClientThread _clientThread=
				                            new ClientThread([ParamList]);
				
				         _clientThread.start();
				        
				        
				       }catch(Exception e){
				
				       }
				
				    }
				
				   /*退出系统*/
				   System.exit(0);
				}
				
				
				/*
				  1。完成客户的连接请求,并验证用户口令
				  2。接受用户的请求,并将请求信息压入堆栈;
				  3。从结果输出队列中搜寻对应的结果信息,并将结果信息发送给客户;
				  4。处理需求处理过程中出现的异常,并将日志信息发送给日志服务器。
				*/
				
				import java.io.*;
				import java.net.*;
				
				public class ClientThread extends Thread {
				
				   public ClientThread([ParamList]){
				
				  }
				   
				  public void synchronized run(){
				
				  }
				}
				  
				
				/*
				  请求队列:
				  1. 将客户的需求压入队列
				  2。将客户的需求弹出队列
				*/
				
				
				import java.util.*;
				
				public  class InputQuene {
				
				  private Vector InputTeam;
				
				  public InputQuene() {
				
				    /*初始化队列容量*/
				    InputTeam=new Vector(100);
				
				  }
				
				  /*需求进队函数*/
				  public synchronized void enQuene(Request request){
				     InputTeam.add(request);
				  }
				
				  /*将一个请求出队*/
				  public synchronized void deQuene(int index){
				    this.InputTeam.remove(index);
				  }
				
				}
				
				
				
				
				/*
				请求队列处理线程 
				1。按先进先出的算法从需求队列中依次取出每一个请求,并进行处理
				2。更新请求的处理状态
				3。清理已经处理过的请求
				*/
				
				
				import java.io.*;
				import java.util.*;
				
				
				public class InputProcessThread extends Thread{
				
				  
				
				  private InputQuene _InQuene;
				
				  public InputProcessThread(){
				  }
				  
				  public void run(){
				  }
				
				}
				
				
				/*
				  结果输出队列:
				  1。完成输出结果的进队
				  2。完成输出结果的出队
				*/
				
				import java.util.*;
				import java.io.*;
				
				public  class OutputQuene {
				
				  //结果输出队列容器
				  private Vector outputTeam;
				
				  public OutputQuene() {
				
				    //初始化结果输出队列
				    outputTeam=new Vector(100);
				  }
				
				  //进队函数
				  public synchronized void enQuene(Result result){
				    outputTeam.add(result);
				  }
				  
				  
				  /*出队函数*/
				  public synchronized void deQuene(int index){
				    outputTeam.remove(index);
				  }
				
				}
				
				
				/*
				  结果处理线程:
				  1。完成输出结果的确认
				  2。完成输出结果文件流的生成
				  3。完成文件流的压缩处理
				*/
				import java.io.*;
				
				public class OutputProcessThread extends Thread{
				
				  
				  private OutputQuene _outputQuene;
				
				  public OutputProcessThread([ParamList]) {
				    //todo
				  }
				
				  /*线程的执行绪*/
				  public void run(){
				    while(doing){
				      try{
				
				           /*处理输出队列*/
				           ProcessQuene();
				
				        }catch(Exception e){
				          e.printStackTrace();
				        }
				
				    }
				
				  }
				
				}
				
				
				/*
				  日志信息处理线程: 
				  功能说明:
				  1。完成服务器日志信息的保存
				  2。根据设定的规则进行日志信息的清理
				
				  期望的目标:
				    目前日志信息的保存在一个文件当中,以后要自动控制文件的大小。
				*/
				
				
				import java.io.*;
				import java.util.*;
				
				public class LogThread extends Thread{
				  private LogQuene logquene;
				  
				  public LogThread([ParamList]){
				    //todo
				  }
				
				  /*处理日志信息*/
				  public void run(){
				    while(doing){
				     this.processLog();
				     try{
				       this.sleep(100);
				     }catch(Exception e){
				     }
				    }
				   }
				}  
				
				
				
				/* 功能描述:
				   管理缓冲区中的文件信息,将文件所有的大小控制在系统设定的范围之内
				*/
				import java.io.*;
				import java.lang.*;
				import java.util.*;
				import java.text.*;
				import java.math.*;
				
				
				public class CacheThread  extends Thread{
				  
				  private String CachePath;
				  
				  /*类的建构式 : 参数:URL 缓冲区目录的路径信息*/
				  public CacheThread(String Url) {
				    this.CachePath =Url;
				
				    /*创建文件搜索类*/
				    try{
				      this.CacheDir =new File(this.CachePath);
				    }catch(Exception e){
				      e.printStackTrace();
				    }
				
				  }
				
				  //线程的执行绪
				  public void run(){
				    //定时清理缓冲区中的文件
				  }
				
				  ......
				
				}
				
				本栏文章均来自于互联网,版权归原作者和各发布网站所有,本站收集这些文章仅供学习参考之用。任何人都不能将这些文章用于商业或者其他目的。( ProgramFan.Com )
				 
							

相关资源