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

简介: 50行代码实现网站服务器 2

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

 

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

 

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


更多精彩文章:


目录
相关文章
|
3月前
|
固态存储 安全 程序员
搭建程序员个人博客网站的服务器配置怎么选?
搭建个人博客网站时,合理选择服务器配置至关重要。推荐1核CPU、2GiB内存、SSD硬盘及2M-10M带宽,适合大多数个人博客。操作系统方面,Linux更为经济高效。建议选择如阿里云等知名云服务商,同时考虑服务器的可扩展性和安全性,确保网站稳定运行与良好体验。
|
3月前
|
运维 安全 Linux
怎么使用云服务器搭建个人博客网站
使用云服务器搭建个人博客网站是一个涉及多个步骤的过程,包括购买云服务器、域名注册和备案、环境配置、安装博客系统、部署SSL证书以及网站上线和维护。通过选择合适的云服务提供商(如阿里云、腾讯云等),配置服务器,安装宝塔面板,选择合适的博客程序(如Typecho、WordPress等),并确保安全措施到位,您可以成功搭建并运行自己的个人博客网站。
|
6天前
|
弹性计算 运维 Ubuntu
使用阿里云服务器自动搭建WordPress网站流程,超简单by系统运维管理OOS
本教程介绍如何使用阿里云服务器(ECS)和系统运维管理OOS自动搭建WordPress网站,支持Ubuntu、CentOS及Alibaba Cloud Linux等操作系统。前提条件包括ECS实例处于运行中、有公网IP且安全组已开启80端口。安装步骤简单:进入ECS快速购买控制台选择预装WordPress,确认下单后通过管理控制台查看实例详情并开放安全组端口。最后,通过实例公网IP访问,出现WordPress登录页即表示安装成功。
|
2月前
|
安全 Linux 应用服务中间件
从零开始启动、配置、保护你的云服务器并搭建一个简单的网站
本文详细介绍了如何准备原料、搭建基础环境、进行安全防护、建设网站、管理证书以及开启BBR优化网络性能。主要内容包括获取健康云服务器、配置SSH登录、创建非root用户、启用密钥认证、安装Nginx、申请TLS证书、配置HTTPS自动跳转及优化网络性能等步骤。通过本文,读者可以掌握从零开始搭建个人网站的全过程。
52 1
从零开始启动、配置、保护你的云服务器并搭建一个简单的网站
|
1月前
|
开发框架 .NET PHP
网站应用项目如何选择阿里云服务器实例规格+内存+CPU+带宽+操作系统等配置
对于使用阿里云服务器的搭建网站的用户来说,面对众多可选的实例规格和配置选项,我们应该如何做出最佳选择,以最大化业务效益并控制成本,成为大家比较关注的问题,如果实例、内存、CPU、带宽等配置选择不合适,可能会影响到自己业务在云服务器上的计算性能及后期运营状况,本文将详细解析企业在搭建网站应用项目时选购阿里云服务器应考虑的一些因素,以供参考。
|
2月前
|
安全 数据挖掘 网络安全
网站建站如何选择合适的服务器配置
建站初期应进行长期数据分析与预测,合理选择服务器配置。主要依据同时在线人数、CPU性能、内存大小及带宽类型,同时考虑安全防护,如选择带防火墙的高防服务器,确保网站稳定运行与良好用户体验。
55 0
|
3月前
|
弹性计算 负载均衡 算法
负载均衡如何帮助阿里云国际服务器搭建的网站或应用程序?
负载均衡如何帮助阿里云国际服务器搭建的网站或应用程序?
|
3月前
|
域名解析 缓存 网络协议
Windows系统云服务器自定义域名解析导致网站无法访问怎么解决?
Windows系统云服务器自定义域名解析导致网站无法访问怎么解决?
|
3月前
|
弹性计算 关系型数据库 MySQL
CentOS 7.x操作系统的ECS云服务器上搭建WordPress网站
CentOS 7.x操作系统的ECS云服务器上搭建WordPress网站
|
3月前
|
网络安全 Docker 容器
【Bug修复】秒杀服务器异常,轻松恢复网站访问--从防火墙到Docker服务的全面解析
【Bug修复】秒杀服务器异常,轻松恢复网站访问--从防火墙到Docker服务的全面解析
85 0
下一篇
开通oss服务