java 开发服务器
本文将分以下几个部分来阐述我的方法:
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(){
//定时清理缓冲区中的文件
}
......
}
java 开发服务器相关推荐
- 学习JAVA游戏服务器开发需要了解的情况
一,游戏服务器开发的工作介绍 近来遇到有很多人想从其它开发领域转到游戏服务器开发行业上来,他们或许觉得游戏服务器开发工资高,或许觉得做游戏服务器需要掌握的技术更高级,可以锻炼自己,或许觉得想换个环境等 ...
- java游戏服务器必备
推荐阅读: 我的CSDN 我的博客园 QQ群:704621321 对于一个新手,想接触游戏服务器,一定会有个疑问--使用Java开发服务器需要学习什么? Java语言,由于学习成本低,开发速度快,稳定 ...
- Linux中的Java项目服务器无故关闭
部署在Linux中的项目,最近一直无故关闭.找了很多都找不到原因.最近发现一个现象终于让我知道是什么原因导致我的开发服务器无故关闭了. 起因 部署在linux中的java开发服务器最近一直无故关闭.且 ...
- Java开发微信公众号(四)---微信服务器post消息体的接收及消息的处理
在前几节文章中我们讲述了微信公众号环境的搭建.如何接入微信公众平台.以及微信服务器请求消息,响应消息,事件消息以及工具处理类的封装:接下来我们重点说一下-微信服务器post消息体的接收及消息的处理,这 ...
- java服务器访问接口提示network error_北京JAVA开发三年,拿到美团35K的offer面试心得...
前言 长文干货提示,文章为大家完整记录了一位在北京做了3年的JAVA开发的朋友,如何通过美团的面试及拿到35K的offer.全篇内容由全程电话录音再手打腾稿,原创手打不易,请记得三连支持! 文章末尾有 ...
- java游戏服务器面试_我做游戏开发这八年
点击上方"CSDN学院精品课",选择"置顶公众号" CSDN学院精品课 IT人的职业提升平台 作者 | kakashi8841 简述这篇文章并不是想教会大家如 ...
- Java后端服务器点餐系统的部署+前端微信小程序开发(13)
Java后端服务器点餐系统的部署+前端微信小程序开发(13) 编译运行小程序 1,本地调试 这和你上面java的运行要保持一致,如果是本地的java项目运行你就用 localhost 后台Java直接 ...
- 【游戏开发】《Java游戏服务器架构实战》项目在windows上部署
[游戏开发]<Java游戏服务器架构实战>项目在windows上部署 文章目录 [游戏开发]<Java游戏服务器架构实战>项目在windows上部署 一.配置项目基础环境 二. ...
- Java游戏服务器开发之概念扫盲
入行缘由 在2017年我正式的从web转Java游戏服务器开发.那个时候机缘巧合的投了一家使用Java语言开发游戏服务器的企业,当时的老板还问我为什么从web转游戏开发.当时我的回答还是历历在目:我喜 ...
最新文章
- 修改密码导致应用程序池无法启动
- C/C++内存分配与Linux内存管理进程所涉及到的五个数据段 .
- 程序员修炼之道--从小工到专家(一)
- sqlmap --os-shell反制小思路
- Dapper的语法应用
- Part Ⅱ At the Restaurant 在饭店??
- (凭什么断点要放入堆栈?)微机学习:第八课
- html做彩色方格,超级炫酷,美图秀秀制作超漂亮彩色格子字图文教程
- 工业相机软件参数介绍
- iOS打包Framework
- matlab统计字符个数,Matlab函数统计字符串中莫个字母含量
- 初中学历可以做原画师吗?原画师需要绘画基础吗
- 垂暮黄昏——回顾CSP2021
- Master HA彻底解密
- css透明到渐变,css渐变(css3背景透明渐变)
- FreeBSD中编译JDK
- 格式化的u盘怎么恢复数据?
- TOGAF企业架构的主要内容——上海信息化培训中心
- echarts设置主副标题位置 分开设置
- sihpostreboot关闭没有权限_修复:Win10系统您目前没有权限访问此文件夹
热门文章
- 神经网络分类器的原理图,神经网络分类器是什么
- vmware16下安装ubuntu20.0报错:发生错误,导致虚拟 CPU 进入关闭状态。如果虚拟机外部发生此错误,则可能已导致物理计算机重新启动……
- 编译内核出错:/bin/sh: 1: bison: not found scripts/Makefile.lib:196: recipe for target ‘scripts/kconfig/zco
- iPhone彻底删除的照片能恢复吗,2个找回永久删除照片的方法
- 可以检测手机帧率和温度的软件_拯救者电竞手机Pro评测:不只是一台手机,更是游戏主机...
- mapper-spring-boot-starter的使用
- CSS3的transform之3d转换、CSS3动画
- linux中可以使用以下命令查看文件内容,在Linux服务器中使用命令行中查看文件内容...
- vscode使用小技巧
- Xshell连接服务器