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

JAVA 自从问世以来,越来越多的大型服务器程序都采用它进行开发,主要是看中它的稳定性及安全性,但对于一个新手来说,您又如何开发您的JAVA 应用服务器,同时又如何规划您的JAVA服务器程序,并且很好的控制您的应用服务器开发的进度,最后,您又如何发布您的JAVA 应用服务器呢?(由于很多前辈已有不错的著作,我只能在这里画画瓢,不足指出,请多来信指正,晚辈将虚心接受!本人的联系方式:linmaochen@sohu.com


  废话少说,下面转入正题:

  本文将分以下几个部分来阐述我的方法:

  1、 怎样分析服务器的需求?
  
  2、 怎样规划服务器的架构?

  3、 怎样规划服务器的目录及命名规范、开发代号?

  4、 原型的开发(一):  怎样设计服务器的代码骨架?

  5、 原型的开发(二): 怎样测试您的代码骨架?

 
  一、 如何分析服务器的需求?

  我的观点是:
   
  服务器就像一台轧汁机,进去的是一根根的甘蔗,出来的是一杯杯的甘蔗汁;也就是说,在开发服务器之前,先要明白,服务器的请求是什么?原始数据是什么?接下来要弄明白,希望得到的结果是什么? 结果数据应该怎样来表述?其实要考虑的很多,无法一一列出(略)。


  二、如何规划服务器的架构?

  首先问大家一个小小的问题:在上海的大都市里,公路上的公交客车大致可以分为以下两类:

  ·空调客车,票价一般为两块,上车不需要排队,能否坐上座位,就要看个人的综合能力;

  ·无人售票车,票价一般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(){
    //定时清理缓冲区中的文件
  }
  ......
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
java进行客户端的applet (小程序)开发的技术已广为使用,而用java进行服务器端的servlet(服务器程序)开发则尚需揭开其神秘的面纱,本书正是基于这样的目的编写的。全书从java服务器的体系结构、开发工具和管理工具、编程技术、安全机制等四个方面全面介绍java服务器的升友技术。通过阅读本书,读者不仅能够知道用java服务器体系结构开发servlet与用传统cgi编写程序的好处,而且还能够掌握编写java servlet的各种技术和技巧。    本书适用于所有对java和web感兴趣的读者使用和参考。 第1部分 java服务器基础[/font] [/font] 第1章 java计算的体系结构[/font] [/font] 1.1 传统的计算模式[/font] 1.1.1 集中式计算模式[/font] 1.1.2 胖客户机/服务器计算模式[/font] 1.1.3 瘦客户机/服务器计算模式[/font] 1.1.4 java desktop与x终端[/font] 1.2 java计算[/font] 1.3 小结[/font] [/font] 第2章 java服务器与servlet[/font] [/font] 2.1 java server的结构[/font] 2.1.1 服务[/font] 2.1.2 服务器[/font] 2.1.3 服务构架[/font] 2.1.4 服务器处理构架[/font] 2.1.5 http服务[/font] .2.1.6 核心servlet[/font] 2 1.7 acl[/font] 2.2 servlet及其功能[/font] 2.2.1 什么是servlet[/font] 2.2.2 servlet与applet的区别[/font] 2.2.3 servlet的应用[/font] 2.3 servlet与cgi的比较[/font] 2.3.1 cgi[/font] 2.3.2 servlet的优点[/font] 2.4 运行servlet[/font] 2.5 小结[/font] [/font] 第2部分 java服务器的开发工具和管理工具[/font] [/font] 第3章 使用java server与servlet开发工具[/font] [/font] 3.1 java web server的安装与启动[/font] 3.1.1 在windows 95或windows nt上安装[/font] 3.1.2 在unix上安装[/font] 3.1.3 java server环境变量的设置[/font] 3.1.4 启动java server[/font] 3.1.5 在端口80上启动java server[/font] 3.1.6 结束java serve的运行[/font] 3.1.7 删除java server[/font] 3.1.8 显示缺省主页[/font] 3.1.9 使用随机文档[/font] 3.2 servlet的加载和调用[/font] 3.2.1 加载servlet[/font] 3.2.2 servlet的标识[/font] 3.2.3 调用servlet[/font] 3.3 jsdk的安装与使用[/font] 3.3.1 servletrunner[/font] 3.3.2 在netscape服务器上安装jsdk[/font] 3.3.3 在apache服务器上安装[/font] 3.4 小结[/font] [/font] 第4章 java web server的管理[/font] [/font] 4.1 进入管理工具[/font] 4.2 设置[/font] 4.2.1 设置web service[/font] 4.2.2 设置proxy service[/font] 4.2.3 设置管理服务[/font] 4.3 监视[/font] 4.3.1 记录输出[/font] 4.3.2 记录统计[/font] 4.3.3 资源的使用[/font] 4.4 安全控制[/font] 4.4.1 用户管理[/font] 4.4.2 用户组[/font] 4.4.3 访问控制表[/font] 4.4.4 资源保护[/font] 4.5 servlet管理[/font] 4.5.1 增加servlet[/font] 4.5.2 设置servlet属性[/font] 4.5.3 修改servlet属性[/font] 4.5.4 删除servlet[/font] 4.6 小结[/font] [/font] 第3部分 java服务器编程[/font] [/font] 第5章 servlet包介绍[/font] [/font] 5.1 javax.servlet包[/font] 5.1.1 接口servlet[/font] 5.1.2 接口servletconfig[/font] 5.1.3 接口servletcontext[/font] 5.1.4 接口servletrequest[/font] 5.1.5 接口servletresponse[/font] 5.1.6 类genericservlet[/font] 5.1.7 类servletinputstream[/font] 5.1.8 类servletoutputstream[/font] 5.2 javax.servlet.http包[/font] 5.2.1 接口httpservletrequest[/font] 5.2.2 接口httpservletresponse[/font] 5.2.3 类httpservlet[/font] 5.2.4 类httputils[/font] 5.3 sun.servlet包介绍[/font] 5.3.1 接口servletconnection[/font] 5.3.2 类servletloader[/font] 5.4 小结[/font] [/font] 第6章 sun.servlet.http包介绍[/font] [/font] 6.1 类cookie[/font] 6.2 类httpdate[/font] 6.3 类httpinputstream[/font] 6.4 类httpoutputstream[/font] 6.5 类httprequest[/font] 6.6 类httpresponse[/font] 6.7 类httpserver[/font] 6.8 类httpserverhandler[/font] 6.9 类httpservletconfig[/font] 6.10 类messagebytes[/font] 6.11 类messagestring[/font] 6.12 类mimeheaderfield[/font] 6.13 类mimeheaders[/font] 6.14 小结[/font] [/font] 第7章 genericservlet编程[/font] [/font] 7.1 servlet编程的一个小例子[/font] 7.1.1 genericservlet在jsdk中的地位[/font] 7.1.2 从hello world学习genericservlet编程[/font] 7.1.3 servlet的两个生命周期函数[/font] 7.2 servlet中的对象[/font] 7.2.1 servlet中的请求和应答对象[/font] 7.2.2 selvlet中的servletconfig对象[/font] 7.3 servlet输出html文件[/font] 7.4 小结[/font] [/font] 第8章 httpservlet编程介绍[/font] [/font] 8.1 http简介[/font] 8.1.1 http协议基本概念及其特点[/font] 8.1.2 http协议的请求和应答[/font] 8.1.3 http协议的信息处理方法[/font] 8.2 httpservlet编程入门[/font] 8.2.1 一个简单例子[/font] 8.2.2 httpservlet的常用对象介绍[/font] 8.3 cookie编程介绍[/font] 8.3.1 cookie简介[/font] 8.3.2 一个cookie例子程序[/font] 8.4 小结[/font] [/font] 第9章 servlet高级编程[/font] [/font] 9.1 servlet与form[/font] 9.1.1 form简介[/font] 9.1.2 一个完整的form[/font] 9.2 编写一个shtml文本[/font] 9.3 异常处理[/font] 9.4 servlet与applet的通信[/font] 9.5 小结[/font] [/font] 第10章 聊天室[/font] [/font] 10.1 “聊天室”客户程序[/font] 10.2 “聊天室”服务器程序[/font] 10.3 “聊天”[/font] 10.4 小结[/font] [/font] 第11章 rmi与servlet[/font] [/font] 11.1 rmi概述[/font] 11.2 如何编写rmi[/font] 11.2.1 定义一个远程接口[/font] 11.2.2 实现远程接口[/font] 11.2.3 写一个applet[/font] 11.2.4 写html文本[/font] 11.2.5 编译和执行[/font] 11.3 rmi与servlet[/font] 11.3.1 定义远程接口[/font] 11.3.2 实现远程接口[/font] 11.3.3 调用rmi的servlet[/font] 11.3.4 调用servlet的applet[/font] 11.3.5 三个超文本文件[/font] 11.3.6 编译和执行[/font] 11.4 小结[/font] [/font] 第12章 servlet与jdbc[/font] [/font] 12.1 jdbc简介[/font] 12.1.1 实现jdbc[/font] 12.1.2 jdbc类细节[/font] 12.2 jdbc与servlet结合[/font] 12.2.1 基本过程[/font] 12.2.2 servlet的同步[/font] 12.2.3 应用举例[/font] 12.3 小结[/font] [/font] 第13章 开发服务[/font] [/font] 13.1 服务[/font] 13.2 实现服务的核心[/font] 13.3 安装服务[/font] 13.3.1 创建属性文件[/font] 13.3.2 创建jamfile[/font] 13.4 创建日志[/font] 13.4.1 日志文件类型[/font] 13.4.2 在自己的服务中加入日志文件[/font] 13.5 服务的参数管理[/font] 13.5.1 系统参数[/font] 13.5.2 增加新的参数[/font] 13.5.3 创建存放参数的域[/font] 13.5.4 实现访问方法[/font] 13.5.5 构造器[/font] 13.5.6 update方法[/font] 13.6 使用realm来创建安全服务[/font] 13.6.1 查找realm[/font] 13.6.2 设置realm[/font] 13.6.3 收集用户数据的对象[/font] 13.6.4 给服务增加身份验证代码[/font] 13.7 小结[/font] [/font] 第14章 pagecompile[/font] [/font] 14.1 生成动态主页[/font] 14.1.1 创建第一个主页[/font] 14.1.2 从html文档到java源文件[/font] 14.2 语法[/font] 14.2.1 声明变量[/font] 14.2.2 条件语句[/font] 14.2.3 循环语句[/font] 14.2.4 注释[/font] 14.2.5 使用backquotes[/font] 14.2.6 使用servlet标记[/font] 14.2.7 输出java表达式[/font] 14.3 使用java类[/font] 14.3.1 重用java类[/font] 14.3.2 创建自己的类[/font] 14.3.3 访问request和response对象[/font] 14.4 servlet初始化参数[/font] 14.5 pagecompile中使用的标记[/font] 14.6 小结[/font] [/font] 第4部分 java服务器安全机制[/font] [/font] 第15章 java web server的安全机制[/font] [/font] 15.1 安全综述[/font] 15.1.1 常见的攻击形式[/font] 15.1.2 java web server的安全机制[/font] 15.1.3 其他特点[/font] 15.1.4 unix上的独有特点[/font] 15.2 web realm机制[/font] 15.2.1 realm模型[/font] 15.2.2 用户和授权[/font] 15.2.3 用户组[/font] 15.3 访问控制表(acl)[/font] 15 3.1 访问控制表结构[/font] 15.3.2 计算权限的规则[/font] 15.3.3 例子[/font] 15.3.4 用法举例[/font] 15.4 ssl机制[/font] 15.4.1 什么是ssl[/font] 15.4.2 建立安全的web服务[/font] 15.4.3 使用认证许可[/font] 15.5 沙盒[/font] 15.6 小结[/font]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值