文档章节

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

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

© 著作权归作者所有

共有 人打赏支持
算法与编程之美
粉丝 291
博文 91
码字总数 100101
作品 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
50行代码实现简单网站服务器?

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

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

没有更多内容

加载失败,请刷新页面

加载更多

websocket 接口简单测试工具,webcoket实用测试工具

chorme 插件 Simple WebSocket Client 对开发来说够用了,能连互联网,也能连本地的。 之前用jmeter 带复杂了,而且登录不好弄,这个基于浏览器,共享浏览器的登录信息。方便!...

SimonAt
16分钟前
1
0
Ext中 get、getDom、getCmp的区别

getDom方法能够得到文档中的DOM节点,该方法中包含一个参数,该参数可以是DOM节点的id、DOM节点对象或DOM节点对应的Ext元素(Element)等。 (与getElementById是一个效果) •Ext.onReady(funct...

休辞醉倒
23分钟前
1
0
springboot jpa 访问数据库

spring boot(五):spring data jpa的使用 SpringBoot非官方教程 | 第三篇:SpringBoot用JdbcTemplates访问Mysql

颖辉小居
38分钟前
4
0
Quartz + Oracle 分布式Job实现

简述 实现 依赖包 <dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.2.3</version><exclusions><exclusion><groupId>com.zax......

呼呼南风
44分钟前
5
0
崛起于Springboot2.X之集成规则引擎Drools(41)

1、创建Springboot项目,勾选Web模块和lombok插件 2、添加pom其他依赖 <dependency> <groupId>org.kie</groupId> <artifactId>kie-spring</artifactId> <version>7.11.0.Fin......

木九天
52分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部