JAVA新手向--实现一个简单的http服务器

image

这篇文章主要写一下如何实现一个简单的http服务器,并且借由这个问题讨论一下别的相关问题。首先实现一个http服务器是一件很难的事吗?这个问题不好回答,如果是一个demo级的http服务器,答案是:很简单,可以说是JAVA刚入门水平就可以做到的。如果是一个可供实际生产的、性能优良,架构优雅的服务器,答案是:很不容易,对大部分的人来说可能很难。不过不管是demo还是成熟的生产用的http服务器,他们核心的部分应该都是相似的,下面我们来分析一下服务器的工作过程:
首先何谓“服务”?服务就是按照客户的要求来完成客户的需求。服务器更具体的表现形式是按照客户的的请求来执行某种操作,返回指定数据,这里的数据和请求更具体的表现形式通常是字符串。也就是说客户端发给服务器一个包含客户端需求的字符串,服务端通过解析客户端发来的字符串,获取客户端的需求,然后完成需求。那么问题来了,服务端如何解析客户端发来的字符串呢?他们之间可是素不相识的,每个客户端按何种组织方式来发送自己的需求对服务器来说完全是不可预期的。于是这就需要一个统一的规范来统一客户端的请求和服务端的返回,以及一些别的行为规范,于是http协议合情合理的出现了。现在事情就变成客户端发给服务器一个满足http协议的、包含客户端需求的字符串,服务端根据http协议来解析客户端发来的字符串获取客户端的需求,然后完成需求,返回符合http协议的字符串给客户端。再然后这里的“发送”,“返回”又具体是什么呢?它们就是客户端和服务器之间通过socket连接执行的一些IO操作。这样分析之后我们大概知道整个的工作流程:客户端建立一个连接到服务端,执行IO操作,把满足http协议的字符串发送给服务器,服务器根据http协议来解析客户端发来的字符串的含义,然后执行对应操作,最后把作为返回结果的、满足http协议的字符串执行IO操作发送给客户端。
通过上面简单的分析我们大概知道http服务器具体干了啥(实际比较复杂)以及我们需要哪些基础前置知识:

  • http协议(编程语言无关,核心):参见RFC2616
  • IO操作(编程语言有关):各大编程语言的IO模块
  • 字符串操作:这就是各大公司考算法题的原因吧(望天==)

后续当然还有:

  • 多线程并发优化处理
  • 设计模式
  • ......

下面是我用JAVA实现一个HTTP服务器,我这个服务器不是简单的小demo(demo只需两个JAVA 类即可搞定==),当然也不是可以生产用的(你可以把它写成可以生成用的),先导知识为Java NIO编程和Java 多线程编程,代码太长不贴,放在github。代码地址:Crab
项目截图:

image

项目的目的是什么呢?最重要的目的是希望可以写出规范化的、工程化的代码以及项目,特别是与入门者来说常常只写一些玩具式的demo,或者盲目的去看一下大型项目的源码,我觉得这样对自己水平的提升帮助有限,事实上我认为对一个人提升最大的是从最开始就接触某个项目或领域,从它萌芽的时候开始参与,一步步由项目和问题驱动着来学习,在遇到问题的时候可以想办法来解决它,想不出来可以去别的项目看看别人是如何解决的,这样既提高了自己的水平,也对别的项目有了更深的理解,知道别人为何这样做,而不是去记忆别人是怎么做的。这里引出的一个问题是:当我们在阅读源码时我认为至少要带着这样几个问题:1.这个东西是干什么的,解决了什么问题。2。这里作者这里为什么要这样做,他的目的是什么,他想干什么。3.我现在想要做的东西需要它吗?需要到什么程度(会用?会魔改?)?以项目驱动学习,把从书上,别人源码里的技巧立马用到自己的项目里,才可以让知识真的化为己用。

题外话:当我们学习时我们通常实际上在学习什么?

我的观点是我们在学习时通常实际上更多的在学习各种规范,比如JavaWeb其实通常就是Java语言规范+各种框架的使用规范+网络协议规范,因为计算机科学以及很多工程科学实际是一个人造的体系,支撑这个体系的就是各种规范,修补和发展这个体系也是依赖于各种规范,由于规范可以人造,因此规范可以说是学不完的,因为会不停的有新的规范出来,所以说学无止境。说起学无止境好像每门科学都是学无止境的,我认为科学大致可以分成两种,一直是研究的是基于一种人造的体系,一直是基于自然的体系(当然人造的最后也是基于自然的)。前者的学无止境是由于人类创造的无止境,不断地会有新的问题和规范被创造出来,后者的学无止境更多的是由于大自然的无止境,大到宇宙星辰,小到原子夸克,浩瀚无边地大自然的规范就在那里等待人们去发现。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,340评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,762评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,329评论 0 329
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,678评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,583评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,995评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,493评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,145评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,293评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,250评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,267评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,973评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,556评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,648评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,873评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,257评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,809评论 2 339

推荐阅读更多精彩内容