《用Java写一个通用的服务器程序》01 综述
最近一两年用C++写了好几个基于TCP通信类型程序,都是写一个小型的服务器,监听请求,解析自定义的协议,处理请求,返回结果。每次写新程序时都把老代码拿来,修改一下协议解析部分和业务处理部分,然后就一个新的程序就诞生了。如此这般做了几回,就萌生了一个想法:是不是可以做一个通用的服务器程序,每次只要实现很少的代码就可以构建的一个新的服务器程序?
巧的是在用C++写代码的时候,我刚好碰到过一个叫做Push Framework的开源项目(在这里可以找到:www.pushframework.com),就是干这个的,功能完整,性能不错。
因为本人主要做Java,因此就萌生了把它翻译成Java版本的想法,这个过程可以学到两点:
1. 服务器程序的基本架构
2. Java网络部分的API
说到这个,就想起了Netty和Mina,就提供这种类型的功能,而且还提供异步I/O。除了这两个著名的项目,我还发现Java世界里有类似功能的项目还有一些:
1. Grizzly (https://grizzly.java.net/): 从GlassFish服务器程序中分离出来的,用Java NIO实现。
2. IoServer (https://code.google.com/p/ioserver/): 国人的项目,号称比Mina更轻量级,专注于手游方面的服务器。
3. Quick Server (http://www.quickserver.org/): 基于TCP,同样是只需要专注于协议和处理逻辑。
看到有不少类似的项目,啥逼格都没有了,那就纯属基础学习吧。这里贴一下自己的这个项目的地址:Java Push Framework (https://github.com/wanly3643/Java-Push-Framework/)。目前一个能运行的版本已经提交上去了,有兴趣的朋友可以拿去看看,文档正在抓紧写。
翻译成Java版本之后,根据自己的理解画了一个服务器程序的简单架构图:

第一行表示新的客户端到达时的处理逻辑,第二三行表示有新的请求到达时的处理逻辑。
一个服务器应该提供一个监视服务,提供一个监听服务端口获取服务器的运行状态。因为对于监视请求的处理和普通客户端很类似,因此可以和普通客户端一起处理。
此外对于服务器来说,还需要包含广播功能,这就需要一个广播管理模块,广播消息队列以及广播消息发送模块。
其实,做这个通用的服务器框架只是第一步,后面还打算自己实现HTTP协议,然后再实现servlet容器,这样就能出来一个小的tomcat了。
这是一条线,还有一条线就是研究服务器程序性能方面的研究。
开篇就写这么多,后面会按照模块来分析,写一些思路和实现代码时遇到的问题。
《用Java写一个通用的服务器程序》01 综述的更多相关文章
- 《用Java写一个通用的服务器程序》02 监听器
在一个服务器程序中,监听器的作用类似于公司前台,起引导作用,因此监听器花在每个新连接上的时间应该尽可能短,这样才能保证最快响应. 回到编程本身来说: 1. 监听器最好由单独的线程运行 2. 监听器在接 ...
- 《用Java写一个通用的服务器程序》03 处理新socket
在讲监听器时说过处理的新的socket要尽快返回,监听器调用的是ClientFactory的createPhysicalConnection方法,那么就来看这个方法: public boolean c ...
- 五:用JAVA写一个阿里云VPC Open API调用程序
用JAVA写一个阿里云VPC Open API调用程序 摘要:用JAVA拼出来Open API的URL 引言 VPC提供了丰富的API接口,让网络工程是可以通过API调用的方式管理网络资源.用程序和软 ...
- 用JAVA写一个多线程程序,写四个线程,其中二个对一个变量加1,另外二个对一个变量减1
package com.ljn.base; /** * @author lijinnan * @date:2013-9-12 上午9:55:32 */ public class IncDecThrea ...
- CBrother脚本10分钟写一个拯救“小霸王服务器”的程序
CBrother脚本语言10分钟写一个拯救“小霸王服务器”的程序 到了一家新公司,接手了一坨c++服务器代码,到处内存泄漏,这服务器没有数据库,挂了后重启一下就好了,公司就这么凑活着用了几年了,定时重 ...
- (原创)如何使用boost.asio写一个简单的通信程序(一)
boost.asio相信很多人听说过,作为一个跨平台的通信库,它的性能是很出色的,然而它却谈不上好用,里面有很多地方稍不注意就会出错,要正确的用好asio还是需要花一番精力去学习和实践的,本文将通过介 ...
- 用JAVA写一个函数,功能例如以下: 随意给定一组数, 找出随意数相加之后的结果为35(随意设定)的情况
用JAVA写一个函数.功能例如以下:随意给定一组数,比如{12,60,-8,99,15,35,17,18},找出随意数相加之后的结果为35(随意设定)的情况. 能够递归算法来解: package te ...
- 用java写一个servlet,可以将放在tomcat项目根目录下的文件进行下载
用java写一个servlet,可以将放在tomcat项目根目录下的文件进行下载,将一个完整的项目进行展示,主要有以下几个部分: 1.servlet部分 Export 2.工具类:TxtFileU ...
- 使用JAVA写一个简单的日历
JAVA写一个简单的日历import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateF ...
随机推荐
- java统计英文字母、空格、数字和其它字符的数目
package tes; import java.util.Scanner; //java统计英文字母,空格,数字和其它字符的数目 public class ZiFuTongJi { public s ...
- 解决Nginx+Tomcat时ContextPath不同的问题
1 问题描述 项目前端模板使用Thymeleaf,在对各种URL进行格式化输出时,都使用@{uri}代码.它会自动读取项目部署的虚拟路径,添加到URI的前端输出. 真实测试和生产环境中, ...
- 在 JPA、Hibernate 和 Spring 中配置 Ehcache 缓存
jpa, hibernate 和 spring 时配置 ehcache 二级缓存的步骤. 缓存配置 首先在 persistence.xml 配置文件中添加下面内容: <property name ...
- sql里的null和空的区别
null表示为未知,未定义: 空表示为空白,或者0: sql查询,排序时null在''的前面: 定义字段为not null,写为空可以写入: null不可以用来比较,只能用is null判断:
- Java基础总结--变量、运算符总结
---变量基本概述----变量作用:就是用来存储数据变量的声明:变量类型 变量名;变量类型---区分不同类型的数据,变量名--按名访问变量变量名(规则):见名识意,第一个字母小写后面驼峰规则变量的作用 ...
- 【HDFS】相关概念及常用命令
本文用于记录Hadoop中HDFS相关概念以及常用命令,以便日后查询. 概念之间无先后顺序,只是用于记录. 参考的Hadoop的版本是2.7.3 1. 角色 hadoop fs [hdfs dfs] ...
- RabbitMQ 默认端口号
4369 (epmd), 25672 (Erlang distribution) 5672, 5671 (AMQP 0-9-1 without and with TLS) 15672 (if mana ...
- IIS 服务无法在此时接受控制信息
应用程序池无法重新启动,报错:服务无法在此时接受控制信息 解决方法:重启 Credential Manager服务即可
- JavaScript 和 TypeScript 交叉口 —— 类型定义文件(*.d.ts)
在 <从 JavaScript 到 TypeScript 系列> 文章我们已经学习了 TypeScript 相关的知识. TypeScript 的核心在于静态类型,我们在编写 TS 的时候 ...
- SQL Server本地连接不上
1.打开SQL Server 2014配置管理器 2.启动服务