【HTTP协议其实很简单】03.自己写一个微型静态Web服务器
自己做一个微型静态Web服务器
这一篇简单粗暴一点,先上干货,看代码注释
JDK版本:1.8
实现自定义错误页、404页。
package com.hawkon;import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Date;public class MyServer {public static String HOME_DIR = "d:/home"; //定义服务器默认的文件夹在哪里public static String NOT_FOUND_FILE = "d:/home/404.html"; //定义404错误页public static String ERR_FILE = "d:/home/err.html"; //定义500错误页public static String DEFAULT_FILE = "/index.html"; //定义默认页面public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(8009); //定义端口while (true) { //循环是不断的接受新的请求Socket socket = serverSocket.accept(); //当服务器运行起来没有请求的时候会在这里等待InputStream is = socket.getInputStream(); //创建一个输入流InputStreamReader sr = new InputStreamReader(is); //过渡代码主要是为下一行创建对象BufferedReader br = new BufferedReader(sr); //创建BufferedReader对象,在本文中采用一行一行的读的方式,比较方便。try {String request = "";request = br.readLine(); //只读取了第一行,后面报头本文暂时没用。System.out.println("request:");System.out.println(request); //输出一下请求的报头String[] arr = request.split(" "); //拆分出第一行的三部分内容do { //循环是为了把剩下的请求内容读完,否则会产生异常request=br.readLine();System.out.println(request); //把全部报头都输出}while(!request.equals(""));if (arr.length != 3 || !arr[0].equals("GET")) { //如果不是GET请求,拆分出的第一行也不是三部分内容直接返回错误页outPutFile(ERR_FILE, socket.getOutputStream(), 500);} else {String path = arr[1]; //取出请求的资源路径if(path.equals("/")) //如果请求的内容没有指定文件,则返回默认的页面path=DEFAULT_FILE;if (Files.exists(Paths.get(HOME_DIR + path))) { //判断文件是否存在 ,如果不存在,返回404页面outPutFile(HOME_DIR + path, socket.getOutputStream(), 200);} else { //如果文件不存在,返回404页面outPutFile(NOT_FOUND_FILE, socket.getOutputStream(), 404);}}} catch (Exception ex) {ex.printStackTrace(); //输出异常信息} finally {br.close();sr.close();is.close();}}}public static void outPutFile(String fileName, OutputStream os, int status) throws IOException {System.out.println("response:");System.out.println(fileName);StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("HTTP/1.1 " + status + " OK\r\n"); //输出状态码stringBuilder.append("Date: " + (new Date()).toString() + "\r\n");stringBuilder.append("Server: MyServer 0.0.1\r\n"); //代表服务器的软件名称stringBuilder.append("X-Powered-By: Hawkon\r\n"); //这行可以换成你的英文名,看起来会有点diaostringBuilder.append("Keep-Alive: timeout=5, max=100\r\n");stringBuilder.append("Connection: Keep-Alive\r\n");stringBuilder.append("Content-Type: text/html;charset=utf-8\r\n"); //字符串编码stringBuilder.append("\r\n");//多输出一个空行,用来分割报头和报体,HTTP协议要求FileInputStream fis = new FileInputStream(fileName);byte[] bytes = new byte[1024];int len;os.write(stringBuilder.toString().getBytes("UTF-8")); //输出响应报头while ((len = fis.read(bytes)) != -1) { //输出文件内容os.write(bytes, 0, len);}os.flush();os.close();fis.close();}
}
下图是请求响应的报头信息。
浏览器运行的情况
【HTTP协议其实很简单】03.自己写一个微型静态Web服务器相关推荐
- Python写一个简易的web服务器
Greg Wilson是Software Carpentry(为科学家和工程师提供在计算技能方面的速成课程)的创始人.他已经在学术界和工业界工作了30年,是几本计算方面的书,包括获得2008年jolt ...
- 企业上云很简单,细数华为云弹性云服务器ECS的多项优势
企业上云很简单,细数华为云弹性云服务器ECS的多项优势 随着社会的飞速发展,云计算.物联网等新兴技术正切实的改变着我们的生产方式及生活场景.由于云技术本身在工作效率.存储容量.安全性能等方面的优势,越 ...
- 用Java手写一个微型下载资源网站
文章目录 手写一个微型下载资源网站[Java实现用户注册.登陆.下载功能] 一.技术栈 二.流程分析图 注册 登陆 下载 三.案例实现效果 首页 注册 登陆 下载网主页 壁纸下载 书籍下载 影视下载 ...
- Python基础 3.4 HTTP协议和静态Web服务器
HTTP协议和静态Web服务器 3.4.1 HTTP协议 1.HTTP协议介绍 全程:超文本传输协议 作用:规定浏览器和web服务器通信的数据格式 HTTP协议是在应用层的协议,基于传输层的TCP传输 ...
- Python 高级:05 HTTP 协议和静态 Web 服务器
一.HTTP 协议 1. HTTP 协议的介绍 HTTP 协议的全称是(Hyper Text Transfer Protocol),翻译过来就是超文本传输协议.超文本就是超级文本的缩写,是指超越文本限 ...
- 自己写一个微型数据库_“最国际化的微型机构:”两名伦敦训练营的毕业生如何建造了一个远程…...
自己写一个微型数据库 by Rebecca Radding 由丽贝卡·拉丁(Rebecca Radding) "最国际化的微型机构:"两名伦敦训练营毕业生如何与加沙的软件工程师建立 ...
- 〖Web全栈开发③〗—HTTP协议和静态web服务器
HTTP协议和静态web服务器 (一)三次握手和四次挥手 (二)HTTP协议 2.1 HTTP协议的定义 2.2 HTTP协议的组成 (三)搭建python自带静态web服务器 3.1 静态web服务 ...
- 很懒了不爱写,一个狮心王的修改器...就写了2个功能,今天有朋友要至少把MP锁了,就再加一项吧..今天修改器写完了,可以下了
将442E66 连续2字节修改为 90 90就可以锁定技能点,怎么加也够了....培养个全能吧 将5FFF5C 连续2字节修改为 01 ED就可以随意买东西..根本不花钱,不过物品栏金钱显示也变0了. ...
- 原来热加载如此简单,手动写一个 Java 热加载吧
1. 什么是热加载 热加载是指可以在不重启服务的情况下让更改的代码生效,热加载可以显著的提升开发以及调试的效率,它是基于 Java 的类加载器实现的,但是由于热加载的不安全性,一般不会用于正式的生产环 ...
最新文章
- C++中extern的使用
- mysql 查询临时表列名_为什么mysql会缓存被删除的临时表的列名?
- 压力测试+webbench+ab+tsung+siege
- 指标体系|四个模型教会你指标体系构建的方法
- JUnit5基本用法
- REST API之前端跨域访问
- 英国电信移除华为设备后,多家运营商继续与华为合作,并达成20亿英镑协议...
- 排名前5的iOS测试自动化框架
- aliplayer播放器使用
- 百度服务器保存信息多久,百度识图会保存图片在服务器上吗?
- 简单无迹kalman的matlab程序,卡尔曼滤波原理及应用——MATLAB仿真
- 批处理命令——bat文件创建和基本命令语法
- 阿里云快照如何恢复到另外一台服务器
- Pinbox使用感受
- 关于CDN和DNS技术的解析以及搭建智能DNS的方法
- JS中对象key为数字的使用
- 服务器上的压缩文件怎么解压,什么是压缩文件,如何解压?
- matlab求线性方程组的符号解,符号代数线性方程组的MATLAB求解.PPT
- ABB机器人 String 的读取和写入
- 滥用线程,导致线上线程池被撑爆的一次意外