本系列教程将和您一起探讨如何利用Java语言一步一步实现自己的web服务器。

1 需求描述

第1讲我们要实现的效果是:当我们在浏览器的地址栏输入localhost:8080的时候,我们会看到"hello,this is my web server!"。如下:

2 实现

做任何事情都不能太急,对于编程来说也不例外。以上的案例虽然简单,但却是我们编写web服务器的非常关键的一步,麻雀虽小,五脏俱全。

2.1 基础知识

首先我们来分析一下,为了实现上面的功能,我们需要具备哪些基础知识。

1) CS架构介绍

CS架构是一种非常常见的软件架构,主要由两部分组成:客户端和服务器端即C端和S端。

图 2-1 CS架构

其一般的交互流程为:客户端发送一条请求给服务器,服务器在收到请求后,解析处理该请求,并将结果以响应的方式返回给客户端。

那么在我们要要实现的需求中,客户端特定为浏览器,请求特指http请求,响应特指http响应。

一般情况CS架构的软件,我们需要分别开发C端和S端的程序,但是由于本题客户端就是我们日常使用的浏览器,所以我们不需要开发C端程序,所以仅需要开发服务器端程序。

这是我们实现需求需要了解的第一个基础知识。

2)http请求和响应

有了上面的基础知识后,接下来我们需要具体的了解,这个http请求长什么样,http响应长什么样?

下面我们来看一个具体的请求和响应报文的格式:

http请求报文:

GET / HTTP/1.1

Host: www.baidu.com.cn

Connection: keep-alive

Pragma: no-cache

Cache-Control: no-cache

Upgrade-Insecure-Requests: 1

User-Agent: Mozilla/5.0(Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/56.0.2924.87 Safari/537.36

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8

Accept-Encoding: gzip, deflate,sdch

Accept-Language:zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4,ja;q=0.2

http响应报文:

HTTP/1.1 200 OK

Cache-Control: private

Content-Length: 21005

Content-Type: text/html

Server: Microsoft-IIS/7.0

X-Powered-By: ASP.NET

Date: Tue, 07 Mar 2017 01:59:58GMT

3)Socket编程

有了以上的基础知识之后,我们还需要了解Java在实现CS架构时使用的具体技术,那就是socket编程。socket编程的入门其实并不难,下面为大家做简要介绍:

socket编程可以分为两部分,一部分为服务器端的编程,另外一部分为客户端。对于服务器端我们使用ServerSocket类,客户端使用Socket类。

一旦建立连接后,获取了客户端的socket对象,接下来就可以通过socket对象的InputStream来读取请求,而OutputStream来写响应。

2.2 实现

有了上面的3个基础知识点后,接下来我们可以开始编程实现了。

主要的业务流程为:

服务器端利用ServerSocket开启8080端口开始监听;

当有客户端发起的http请求时,接受该客户端读取http请求,进行相关处理;

返回http响应。

具体的代码实现如下:

public class WebServer {

private ServerSocket serverSocket;

public WebServer() {

try {

// 开启8080端口监听

serverSocket = newServerSocket(8080);

} catch (IOException e) {

e.printStackTrace();

}

}

public void run(){

try {

Socket socket =serverSocket.accept();

// 读取http请求

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

String line = null;

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

System.out.println(line);

}

// 返回http响应

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

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

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

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

writer.flush();

socket.close();

} catch (IOException e) {

e.printStackTrace();

}

}

public static void main(String[] args) {

new WebServer().run();

}

}

3 总结

我们已经按照需求实现了相关功能,但是细心的你可能会发现以下的问题:

1)浏览器刷新一次,服务器端程序就终止了;

2)这个服务器能不能作为静态网页html服务器呢?

3)。。。

网页服务器编程,50行代码实现简单网站服务器相关推荐

  1. 如何用50行代码构建情感分类器

    选自Toward Data Science,作者:Rohith Gandhi,机器之心编译. 本文介绍了如何构建情感分类器,从介绍自然语言处理开始,一步一步讲述构建过程. 自然语言处理简介 语言把人类 ...

  2. python爬虫实战:利用scrapy,短短50行代码下载整站短视频

    近日,有朋友向我求助一件小事儿,他在一个短视频app上看到一个好玩儿的段子,想下载下来,可死活找不到下载的方法.这忙我得帮,少不得就抓包分析了一下这个app,找到了视频的下载链接,帮他解决了这个小问题 ...

  3. python皮卡丘编程代码_再接再厉,用python编程13行代码解方程组(纯字符)

    因为是示例为主,我们将方程组限制在二元一次方程组:x,y两个变量,两个方程.类似这样: 每个方程有两个变量,x和y,形式为:ax+by+c=d 由于这次有了两个方程,我们提取参数的代码就适合提炼为一个 ...

  4. pyquery获取不到网页完整源代码_爬虫神器之PyQuery实用教程(二),50行代码爬取穷游网...

    爬虫神器之PyQuery实用教程(二),50行代码爬取穷游网 前言 上篇文章 PyQuery (一) 回顾.今天来介绍具体 PyQuery 的使用方法. 穷游网目标与分析 开始之前,按照之前的套路一步 ...

  5. 【PyTorch】50行代码实现GAN——PyTorch

    本文来源于PyTorch中文网. 一直想了解GAN到底是个什么东西,却一直没能腾出时间来认真研究,前几日正好搜到一篇关于PyTorch实现GAN训练的文章,特将学习记录如下,本文主要包含两个部分:GA ...

  6. python跑酷游戏源码_HTML5游戏实战(1):50行代码实现正面跑酷游戏

    前段时间看到一个"熊来了"的HTML5跑酷游戏,它是一个典型的正面2D跑酷游戏,这里借用它来介绍一下用Gamebuilder+CanTK开发正面跑酷游戏的基本方法. CanTK(C ...

  7. 转:目标50行代码之内完成3d编辑器功能

    1024程序员节刚过,手痒想实现一个html的3d编辑器,看了three.js  同时还看了网上流传已久的<<基于 HTML5 Canvas 的简易 2D 3D 编辑器>>,都 ...

  8. 利用scrapy,短短50行代码下载整站短视频

    一.撕开爬虫的面纱--爬虫是什么,它能做什么 爬虫是什么 爬虫就是一段能够从互联网上高效获取数据的程序. 我们每天都在从互联网上获取数据.当打开浏览器访问百度的时候,我们就从百度的服务器获取数据,当拿 ...

  9. 50行代码实现的艺术签名设计微信小程序,轻松对接公众号,涨粉神器,学习赚钱两不误.微信公众号引流工具.html,python学习小项目.艺术签名设计微信小程序,前端学习小项目有趣的项目

    50行代码实现的艺术签名设计微信小程序,轻松对接公众号,涨粉神器,学习赚钱两不误 先看效果 这个小程序实现艺术签名设计的功能 对接到公众号之后,相当于给你的公众号添加了一个功能,别人关注公众号后,可以 ...

最新文章

  1. 7大类卷积神经网络(CNN)创新综述
  2. 2013\Province_C_C++_A\4.颠倒的价牌
  3. 李林APUE之进程的封装
  4. 信息学奥赛一本通(1053:最大数输出)
  5. 【转】Java魔法堂:String.format详解
  6. AVG开发过程记录(3) —— 半透明的实现
  7. sencha touch 2中list控件分组排序
  8. 汇编语言源程序基础分析--跑马灯
  9. 计算机一级基础知识理论,计算机一级考试理论试题 第6部分 信息与计算机基础知识...
  10. moodle平台安装及环境配置(包括安装过程详细截图)
  11. 智能电视老是无服务器,智能电视无法联网原因解析及最新解决办法!
  12. Cocoa Touch基础
  13. 成长的痛苦:流播放服务令音乐人版税受损
  14. 什么是深度学习,深度学习和机器学习之间,主要有什么区别
  15. AMS1117接线图
  16. 来自东南亚的极兔被“封杀”,老家还能保住吗?
  17. Ubuntu安装软件包网络不可达问题
  18. Click House设置远程登陆及修改默认用户名密码
  19. 上网行为管理:关于PDD员工发帖溯源联想到的相关技术与实现
  20. r语言summary函数使用_R语言--操纵数据--重要函数的使用

热门文章

  1. python爬虫脚本-动态加载实现方法
  2. 多系统linux系统引导修复工具,EasyBCD引导双系统|EasyBCD双系统引导修复工具 V2.4.0.237 中文免费版 下载_当下软件园_软件下载...
  3. 东北大学计算机专业(专业硕士)研究生入学考试2009真题
  4. 劳易测BPS 307i SM 100 - 条码定位系统
  5. requests接口测试
  6. Mysqldump参数解析大全
  7. 基于51单片机的多功能八路抢答器
  8. unity图片插件精灵
  9. 人工智能(PythonWeb)—— Django
  10. 阿里版 ChatGPT 突然上线!