文档章节

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

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

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

© 著作权归作者所有

共有 人打赏支持
算法与编程之美
粉丝 289
博文 89
码字总数 97411
作品 0
成都
程序员
python快速求解不定积分和定积分

欢迎点击「算法与编程之美」↑关注我们! 本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列博客。 基本概念 定积分的定义如下: 不定积分定义如下: 如果想了解更多,...

算法与编程之美
07/10
0
0
Jupyter快速编辑高大上数学公式 泰勒展开式

欢迎点击「算法与编程之美」↑关注我们! 本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列博客。 人工智能的基础是机器学习,而通过之前的几篇博客了解到,机器学习的...

算法与编程之美
07/09
0
0
c#开发电子商务网站---我的笔记

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

crossmix
2015/12/27
450
0
Go 实现的 TCP 异步框架 - Tao

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

匿名
03/09
0
0
CSS Sprites(精灵/雪碧)技术原理和使用

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

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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JS:异步 - 面试惨案

为什么会写这篇文章,很明显不符合我的性格的东西,原因是前段时间参与了一个面试,对于很多程序员来说,面试时候多么的鸦雀无声,事后心里就有多么的千军万马。去掉最开始毕业干了一年的Jav...

xmqywx
今天
0
0
Win10 64位系统,PHP 扩展 curl插件

执行:1. 拷贝php安装目录下,libeay32.dll、ssleay32.dll 、 libssh2.dll 到 C:\windows\system32 目录。2. 拷贝php/ext目录下, php_curl.dll 到 C:\windows\system32 目录; 3. p...

放飞E梦想O
今天
0
0
谈谈神秘的ES6——(五)解构赋值【对象篇】

上一节课我们了解了有关数组的解构赋值相关内容,这节课,我们接着,来讲讲对象的解构赋值。 解构不仅可以用于数组,还可以用于对象。 let { foo, bar } = { foo: "aaa", bar: "bbb" };fo...

JandenMa
今天
1
0
OSChina 周一乱弹 —— 有人要给本汪介绍妹子啦

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享水木年华的单曲《中学时代》@小小编辑 手机党少年们想听歌,请使劲儿戳(这里) @须臾时光:夏天还在做最后的挣扎,但是晚上...

小小编辑
今天
18
4
centos7安装redis及开机启动

配置编译环境: sudo yum install gcc-c++ 下载源码: wget http://download.redis.io/releases/redis-3.2.8.tar.gz 解压源码: tar -zxvf redis-3.2.8.tar.gz 进入到解压目录: cd redis-3......

hotsmile
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部