科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道如何规划您的大型JAVA多并发服务器程序

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

  JAVA 自从问世以来,越来越多的大型服务器程序都采用它进行开发,主要是看中 它的稳定性及安全性,但对于一个新手来说,您又如何开发您的JAVA 应用服务器, 同时又如何规划您的JAVA服务器程序,并且很好的控制您的应用服务器开发的进度, 最后,您

作者:中国IT实验室 来源:中国IT实验室 2007年9月9日

关键字: 69826 编程 java

  • 评论
  • 分享微博
  • 分享邮件
  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 clas

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章