网页服务器编程,50行代码实现简单网站服务器
本系列教程将和您一起探讨如何利用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行代码实现简单网站服务器相关推荐
- 如何用50行代码构建情感分类器
选自Toward Data Science,作者:Rohith Gandhi,机器之心编译. 本文介绍了如何构建情感分类器,从介绍自然语言处理开始,一步一步讲述构建过程. 自然语言处理简介 语言把人类 ...
- python爬虫实战:利用scrapy,短短50行代码下载整站短视频
近日,有朋友向我求助一件小事儿,他在一个短视频app上看到一个好玩儿的段子,想下载下来,可死活找不到下载的方法.这忙我得帮,少不得就抓包分析了一下这个app,找到了视频的下载链接,帮他解决了这个小问题 ...
- python皮卡丘编程代码_再接再厉,用python编程13行代码解方程组(纯字符)
因为是示例为主,我们将方程组限制在二元一次方程组:x,y两个变量,两个方程.类似这样: 每个方程有两个变量,x和y,形式为:ax+by+c=d 由于这次有了两个方程,我们提取参数的代码就适合提炼为一个 ...
- pyquery获取不到网页完整源代码_爬虫神器之PyQuery实用教程(二),50行代码爬取穷游网...
爬虫神器之PyQuery实用教程(二),50行代码爬取穷游网 前言 上篇文章 PyQuery (一) 回顾.今天来介绍具体 PyQuery 的使用方法. 穷游网目标与分析 开始之前,按照之前的套路一步 ...
- 【PyTorch】50行代码实现GAN——PyTorch
本文来源于PyTorch中文网. 一直想了解GAN到底是个什么东西,却一直没能腾出时间来认真研究,前几日正好搜到一篇关于PyTorch实现GAN训练的文章,特将学习记录如下,本文主要包含两个部分:GA ...
- python跑酷游戏源码_HTML5游戏实战(1):50行代码实现正面跑酷游戏
前段时间看到一个"熊来了"的HTML5跑酷游戏,它是一个典型的正面2D跑酷游戏,这里借用它来介绍一下用Gamebuilder+CanTK开发正面跑酷游戏的基本方法. CanTK(C ...
- 转:目标50行代码之内完成3d编辑器功能
1024程序员节刚过,手痒想实现一个html的3d编辑器,看了three.js 同时还看了网上流传已久的<<基于 HTML5 Canvas 的简易 2D 3D 编辑器>>,都 ...
- 利用scrapy,短短50行代码下载整站短视频
一.撕开爬虫的面纱--爬虫是什么,它能做什么 爬虫是什么 爬虫就是一段能够从互联网上高效获取数据的程序. 我们每天都在从互联网上获取数据.当打开浏览器访问百度的时候,我们就从百度的服务器获取数据,当拿 ...
- 50行代码实现的艺术签名设计微信小程序,轻松对接公众号,涨粉神器,学习赚钱两不误.微信公众号引流工具.html,python学习小项目.艺术签名设计微信小程序,前端学习小项目有趣的项目
50行代码实现的艺术签名设计微信小程序,轻松对接公众号,涨粉神器,学习赚钱两不误 先看效果 这个小程序实现艺术签名设计的功能 对接到公众号之后,相当于给你的公众号添加了一个功能,别人关注公众号后,可以 ...
最新文章
- 7大类卷积神经网络(CNN)创新综述
- 2013\Province_C_C++_A\4.颠倒的价牌
- 李林APUE之进程的封装
- 信息学奥赛一本通(1053:最大数输出)
- 【转】Java魔法堂:String.format详解
- AVG开发过程记录(3) —— 半透明的实现
- sencha touch 2中list控件分组排序
- 汇编语言源程序基础分析--跑马灯
- 计算机一级基础知识理论,计算机一级考试理论试题 第6部分 信息与计算机基础知识...
- moodle平台安装及环境配置(包括安装过程详细截图)
- 智能电视老是无服务器,智能电视无法联网原因解析及最新解决办法!
- Cocoa Touch基础
- 成长的痛苦:流播放服务令音乐人版税受损
- 什么是深度学习,深度学习和机器学习之间,主要有什么区别
- AMS1117接线图
- 来自东南亚的极兔被“封杀”,老家还能保住吗?
- Ubuntu安装软件包网络不可达问题
- Click House设置远程登陆及修改默认用户名密码
- 上网行为管理:关于PDD员工发帖溯源联想到的相关技术与实现
- r语言summary函数使用_R语言--操纵数据--重要函数的使用
热门文章
- python爬虫脚本-动态加载实现方法
- 多系统linux系统引导修复工具,EasyBCD引导双系统|EasyBCD双系统引导修复工具 V2.4.0.237 中文免费版 下载_当下软件园_软件下载...
- 东北大学计算机专业(专业硕士)研究生入学考试2009真题
- 劳易测BPS 307i SM 100 - 条码定位系统
- requests接口测试
- Mysqldump参数解析大全
- 基于51单片机的多功能八路抢答器
- unity图片插件精灵
- 人工智能(PythonWeb)—— Django
- 阿里版 ChatGPT 突然上线!