最近一两年用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 综述的更多相关文章

  1. 《用Java写一个通用的服务器程序》02 监听器

    在一个服务器程序中,监听器的作用类似于公司前台,起引导作用,因此监听器花在每个新连接上的时间应该尽可能短,这样才能保证最快响应. 回到编程本身来说: 1. 监听器最好由单独的线程运行 2. 监听器在接 ...

  2. 《用Java写一个通用的服务器程序》03 处理新socket

    在讲监听器时说过处理的新的socket要尽快返回,监听器调用的是ClientFactory的createPhysicalConnection方法,那么就来看这个方法: public boolean c ...

  3. 五:用JAVA写一个阿里云VPC Open API调用程序

    用JAVA写一个阿里云VPC Open API调用程序 摘要:用JAVA拼出来Open API的URL 引言 VPC提供了丰富的API接口,让网络工程是可以通过API调用的方式管理网络资源.用程序和软 ...

  4. 用JAVA写一个多线程程序,写四个线程,其中二个对一个变量加1,另外二个对一个变量减1

    package com.ljn.base; /** * @author lijinnan * @date:2013-9-12 上午9:55:32 */ public class IncDecThrea ...

  5. CBrother脚本10分钟写一个拯救“小霸王服务器”的程序

    CBrother脚本语言10分钟写一个拯救“小霸王服务器”的程序 到了一家新公司,接手了一坨c++服务器代码,到处内存泄漏,这服务器没有数据库,挂了后重启一下就好了,公司就这么凑活着用了几年了,定时重 ...

  6. (原创)如何使用boost.asio写一个简单的通信程序(一)

    boost.asio相信很多人听说过,作为一个跨平台的通信库,它的性能是很出色的,然而它却谈不上好用,里面有很多地方稍不注意就会出错,要正确的用好asio还是需要花一番精力去学习和实践的,本文将通过介 ...

  7. 用JAVA写一个函数,功能例如以下: 随意给定一组数, 找出随意数相加之后的结果为35(随意设定)的情况

    用JAVA写一个函数.功能例如以下:随意给定一组数,比如{12,60,-8,99,15,35,17,18},找出随意数相加之后的结果为35(随意设定)的情况. 能够递归算法来解: package te ...

  8. 用java写一个servlet,可以将放在tomcat项目根目录下的文件进行下载

    用java写一个servlet,可以将放在tomcat项目根目录下的文件进行下载,将一个完整的项目进行展示,主要有以下几个部分: 1.servlet部分   Export 2.工具类:TxtFileU ...

  9. 使用JAVA写一个简单的日历

    JAVA写一个简单的日历import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateF ...

随机推荐

  1. C# MessageBox.Show每隔3秒自动关闭

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  2. Python 初学者 入门 应该学习 python 2 还是 python 3?

    许多刚入门 Python 的朋友都在纠结的的问题是:我应该选择学习 python2 还是 python3? 对此,咪博士的回答是:果断 Python3 ! 可是,还有许多小白朋友仍然犹豫:那为什么还是 ...

  3. [原创]InnoDB体系结构

    参阅:<innodb存储引擎内幕> innodb整体的体系结构如下图所示:  整体结构分两大部分:内存和进程其中内存包括:buffer_pool\redo log buffer\addit ...

  4. JDBC工具类实例

    本文以讲解用单利模式实现一个简单的JDBC实用工具类JDBC连接的四个基本步骤:1.加载相应数据库驱动2.建立相应数据库连接3.构建Statement语句,即增删改查SQL语句4.执行Statemen ...

  5. ASP.NET没有魔法——ASP.NET MVC 直连路由(特性路由)

    之前对Controller创建的分析中,知道了Controller的创建是有两个步骤组成,分别是Controller的类型查找以及根据类型创建Controller实例. 在查询Controller的类 ...

  6. IO 调优

    磁盘优化 1.增加缓存 2.优化磁盘的管理系统 3.设计合理的磁盘存储数据块 4.应用合理的RAID策略 TCP网络参数调优 网络IO优化 1.减少网络交互次数 2.减少网络传输数据量的大小 3.尽量 ...

  7. LeetCode 461. Hamming Distance (汉明距离)

    The Hamming distance between two integers is the number of positions at which the corresponding bits ...

  8. 愚蠢的遗留BUG

    二次开发本来就是很恶心的事,我竟然是三次开发. 今天遇到一个BUG,上传图片的时候报错了,操作过程很简答,点击上传按钮,选择图片,确定上传,如图: 报错信息很直白,也很奇怪: (为了写博客,把代码回滚 ...

  9. JS框架设计读书笔记之-选择器引擎02

    选择器引擎涉及相关概念 概念 以Sizzle的主函数声明为例,来说明引擎的相关概念. function Sizzle(selector, context, results, seed) { //... ...

  10. linux GCC 编译多个.c/.h文件

    基本认识: #include <xxx>:首先去系统目录中找头文件,如果没有在到当前目录下找.像标准的头文件 stdio.h.stdlib.h等用这个方法. #include " ...