文档章节

50行代码实现简单的网站服务器 2

算法与编程之美
 算法与编程之美
发布于 2017/04/10 16:07
字数 1019
阅读 14
收藏 1
点赞 0
评论 0

50行代码实现简单网站服务器 1 https://my.oschina.net/gschen/blog/853408

在上一讲我们介绍了如何利用java语言只用50行代码就可以实现一个简单的网站服务器,该服务器的功能是当我们在浏览器的地址栏输入localhost:8080的时候,我们会看到"hello, this is my web server!"。如下:

50行代码实现简单的网站服务器 2

本讲我们将介绍在此基础上,添加新的功能。

1问题描述

对于上述的网站服务器,我们想要在启动之前打印"some operations before server start!",在服务器销毁之前打印"some operations before server destroy!"。

2问题分析

通过对需求的分析,我们发现该需求就是在网站服务器启动前执行某些操作,在服务器销毁前再执行某些操作。初步感觉不是很难实现。

网站服务器的核心代码在run方法内,如下所示:

public void run() throws IOException {

Socket socket = serverSocket.accept();

PrintWriter writer = null;

BufferedReader reader = null;

try {

// 处理http请求

reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

String line = null;

while (!(line = reader.readLine()).equals("")) {

System.out.println(line);

}

// 返回http响应

writer = new PrintWriter(socket.getOutputStream());

writer.print("HTTP/1.1 200 OK\r\n");

writer.print("\r\n");

writer.print("hello,this is my web server!");

writer.flush();

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

socket.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

该代码主要包含两部分,一是处理http请求,二是处理http响应。

故为了实现项目需求,我们能够想到的最直接的方法便是:

public void run() throws IOException {

System.out.println("some operations before server start!");

//省略核心代码

System.out.println("some operations before server destroy!");

}

在核心代码之前和之后分别加上我们需要执行的代码,如红色字体所示。

该方法确实能够满足需求解决问题,但是假如我的需求是这样呢。

public void run() throws IOException {

System.out.println("operation 1 before server start!");

System.out.println("operation 2 before server start!");

//...

System.out.println("operation N before server start!");

// 核心代码部分省略

System.out.println("operation1 before server destroy!");

System.out.println("operation2 before server destroy!");

// ...

System.out.println("operationN before server destroy!");

}

你会发现,随着需求的不断变更,你需要不断的在WebServer中加入新的代码,随着新的代码的不断加入,你会发现WebServer类出现bug的概率将会逐渐升高,另外这也严重违反了面向对象的重要设计原则 --开闭原则。

如何解决该问题?我们将初始化和销毁的操作分别封装在一个类的两个方法里面,因此引入了一个新的类叫WebServerAction,如下:

public class WebServerAction {

public void start(){

System.out.println("operation 1 before server start!");

System.out.println("operation 2 before server start!");

//...

System.out.println("operation N before server start!");

}

public void destroy(){

System.out.println("operation1 before server destroy!");

System.out.println("operation2 before server destroy!");

// ...

System.out.println("operationN before server destroy!");

}

}

有了这个类之后,WebServer类就可以进行下面的修改:

public class WebServer {

private ServerSocket serverSocket;

private WebServerAction webServerAction; //将新的类作为私有变量

WebServer() throws IOException {

serverSocket = new ServerSocket(WebConfig.SERVER_PORT);

webServerAction = new WebServerAction();//初始化

}

public void run() throws IOException {

webServerAction.start();//执行服务器启动初始化工作

//省略核心代码

webServerAction.destroy();//执行服务器销毁工作

}

//...

}

经过上面的修改之后,你会发现今后有新的初始化和销毁需求,我们都不用再修改WebServer核心类,而是在WebServerAction类的两个方法中实现需求。

引入WebServerAction类,在一定程度上改善了代码结构,使代码整体上更可读。但是细心的你会发现,这只不过是一种任务的转移而已。以前需求的变化,你需要不停的修改WebServer类,而现在你是不停的修改WebServerAction类,所以其本质并未改变。

针对此问题,你有什么好的解决思路呢?欢迎留言交流,也欢迎继续关注后续文章。

3总结

本文在第1讲的基础上,提出了一个新的需求,通过不断的分析问题和解决问题,发现最新提出的方案还是不能很好的解决问题。如需了解更多,欢迎持续关注微信公众号“算法与编程之美”,获得更好的阅读体验。

© 著作权归作者所有

共有 人打赏支持
算法与编程之美
粉丝 281
博文 80
码字总数 92711
作品 0
成都
程序员
c#开发电子商务网站---我的笔记

电子商务网站(C#版) 通过一个在线的电子商务网站(网上书店销售系统)的实例,来讲述如何采用ASP.NET 3.5+SQL Server 2010的模式定制一个小型的电子商务平台。系统采用了模块化的设计方法,...

crossmix ⋅ 2015/12/27 ⋅ 0

Go 实现的 TCP 异步框架 - Tao

Tao 是一个轻量级的 TCP 异步框架,使用 Go 语言实现, 1. Tao解决什么问题 1.1 场景 你开发的产品有一套特有的业务逻辑,要通过互联网得到服务端的支持才能为你的客户提供服务。 1.2 问题 ...

匿名 ⋅ 03/09 ⋅ 0

用一句JQuery代码实现表格的简单筛选

JQuery的强大之处,这里就不用讲了。这里将用一行简单的JQuery代码实现简单的表格筛选。先贴上代码: 代码 效果: 这里是经过筛选的截图; JQuery代码就: 代码 里面最重要的就是JQuery的选择...

zting科技 ⋅ 2017/01/10 ⋅ 0

CSS Sprites(精灵/雪碧)技术原理和使用

摘自:http://blog.lehu.shu.edu.cn/hikui/A359743.html 雪碧图,其实就是背景采用一张大图,通过背景的定位来修改使用的背景,这样做可以提高网站的速度(加载一张图对比加载一批图)。 下面...

红羊在北京 ⋅ 2016/07/27 ⋅ 0

用Java编写你自己的简单HTTP服务器

HTTP是个大协议,完整功能的HTTP服务器必须响应资源请求,将URL转换为本地系统的资源名。响应各种形式的HTTP请求(GET、POST 等)。处理不存在的文件请求,返回各种形式的状态码,解析MIME类型...

晨曦之光 ⋅ 2012/02/27 ⋅ 0

Facebook性能大提升的秘密:HipHop

Facebook神秘的PHP项目HipHop for PHP终于揭开面纱。这个项目由一个PHP到C++的转换程序,一个重新实现的PHP运行库,和许多常用PHP扩展的重写版本构成,目的是旨在加速和优化 PHP。 用Faceboo...

crazyinsomnia ⋅ 2010/02/03 ⋅ 13

Facebook揭秘HipHop项目 PHP程序大提速

编程效率高是PHP语言最大的特点,但是作为脚本语言,一直存在着CPU和内存使用效率不高的问题,直到HipHop for PHP的出现。Facebook神秘的PHP项目HipHop for PHP终于揭开面纱。这个项目由一个...

cailylove ⋅ 2011/01/13 ⋅ 0

50行代码实现简单网站服务器?

本系列教程将和您一起探讨如何利用Java语言一步一步实现自己的web服务器。 1 需求描述 第1讲我们要实现的效果是:当我们在浏览器的地址栏输入localhost:8080的时候,我们会看到"hello,this i...

算法与编程之美 ⋅ 2017/03/07 ⋅ 3

8 行 Node.js 代码实现代理服务器

接触 Node.js 已有多年,一直喜欢它的单线程模型和异步IO特性,以及 JavaScript 语言本身的灵活性。同时,JavaScript 前后端通吃,在全栈开发领域具有独特的优势。今天就来看看作为服务端语言...

李中凯 ⋅ 2016/12/06 ⋅ 5

Facebook性能大提升的秘密:HipHop

facebook / hiphop-php https://github.com/facebook/hiphop-php Facebook神秘的PHP项目HipHop for PHP终于揭开面纱。这个项目由一个PHP到C++的转换程序,一个重新实现的PHP运行库,和许多常...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Confluence 6 从其他备份中恢复数据

一般来说,Confluence 数据库可以从 Administration Console 或者 Confluence Setup Wizard 中进行恢复。 如果你在恢复压缩的 XML 备份的时候遇到了问题,你还是可以对整个站点进行恢复的,如...

honeymose ⋅ 21分钟前 ⋅ 0

myeclipse10 快速搭建spring boot开发环境(入门)

1.创建一个maven的web项目 注意上面标红的部分记得选上 2.创建的maven目录结构,有缺失的目录可以自己建立目录补充 补充后 这时候一个maven的web项目创建完成 3.配置pom.xml配置文件 <proje...

小海bug ⋅ 34分钟前 ⋅ 0

nginx.conf

=========================================================================== nginx.conf =========================================================================== user nobody; #......

A__17 ⋅ 37分钟前 ⋅ 0

645. Set Mismatch - LeetCode

Question 645. Set Mismatch Solution 思路: 遍历每个数字,然后将其应该出现的位置上的数字变为其相反数,这样如果我们再变为其相反数之前已经成负数了,说明该数字是重复数,将其将入结果r...

yysue ⋅ 50分钟前 ⋅ 0

Python这么强?红包杀手、消息撤回也可以无视,手机App辅助!

论述 标题也许有点不好理解,其实就是一款利用Python实现的可以监控微信APP内的红包与消息撤回的助手。不得不说,这确实是一款大家钟意的神器。 消息撤回是一件很让人恶心的事,毕竟人都是有...

Python燕大侠 ⋅ 今天 ⋅ 0

压缩打包介绍、gzip压缩工具、bzip2压缩工具、xz压缩工具

压缩打包介绍 压缩的好处不仅能节省磁盘空间而且在传输的时候节省传输时间和网络带宽 windows系统下文件带有 .rar .zip .7z 后缀的就是压缩文件 linux系统下则是 .zip, .gz, .bz2, .xz, ...

黄昏残影 ⋅ 今天 ⋅ 0

观察者模式

1.利用java原生类进行操作 package observer;import java.util.Observable;import java.util.Observer;/** * @author shadow * @Date 2016年8月12日下午7:29:31 * @Fun 观察目标 **/......

Cobbage ⋅ 今天 ⋅ 0

Ubuntu打印服务器配置

参考:https://blog.csdn.net/gsls200808/article/details/50950586 https://blog.csdn.net/jiay2/article/details/80252369 https://wiki.gentoo.org/wiki/HPLIP 由于媳妇儿要大量打印资料,......

大熊猫 ⋅ 今天 ⋅ 0

面试的角度诠释Java工程师(二)

原文出处: locality 续言: 相信每一位简书的作者,都会有我这样的思考:怎么写好一篇文章?或者怎么写好一篇技术类的文章?我就先说说我的感悟吧,写文章其实和写程序是一样的。为什么我会...

颖伙虫 ⋅ 今天 ⋅ 0

github中SSH的Key

https://help.github.com/articles/connecting-to-github-with-ssh/ https://help.github.com/articles/testing-your-ssh-connection/ https://help.github.com/articles/adding-a-new-ssh-k......

whoisliang ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部