陈林茂ID:linmaochen
4431次访问,排名19022(3)好友0人,关注者0
linmaochen的文章
原创 7 篇
翻译 0 篇
转载 0 篇
评论 24 篇
最近评论
文章分类
收藏
    相册
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 如何规划您的大型JAVA多并发服务器程序收藏

    新一篇: 传真服务器开发 三页传真过程全记录(日志形式) | 旧一篇: 如何方便地操纵XML中的数据(JAVA代码具体实现)


                如何规划您的大型JAVA多并发服务器程序

                                           作者: 陈林茂  2002-04-08
     

      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(){
        //定时清理缓冲区中的文件
      }

      ......

    }


    今天就写到这里,以后我会再写!

    发表于 @ 2003年04月09日 09:56:00|评论(loading...)|编辑

    新一篇: 传真服务器开发 三页传真过程全记录(日志形式) | 旧一篇: 如何方便地操纵XML中的数据(JAVA代码具体实现)

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © linmaochen