自己做一个微型静态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服务器相关推荐

  1. Python写一个简易的web服务器

    Greg Wilson是Software Carpentry(为科学家和工程师提供在计算技能方面的速成课程)的创始人.他已经在学术界和工业界工作了30年,是几本计算方面的书,包括获得2008年jolt ...

  2. 企业上云很简单,细数华为云弹性云服务器ECS的多项优势

    企业上云很简单,细数华为云弹性云服务器ECS的多项优势 随着社会的飞速发展,云计算.物联网等新兴技术正切实的改变着我们的生产方式及生活场景.由于云技术本身在工作效率.存储容量.安全性能等方面的优势,越 ...

  3. 用Java手写一个微型下载资源网站

    文章目录 手写一个微型下载资源网站[Java实现用户注册.登陆.下载功能] 一.技术栈 二.流程分析图 注册 登陆 下载 三.案例实现效果 首页 注册 登陆 下载网主页 壁纸下载 书籍下载 影视下载 ...

  4. Python基础 3.4 HTTP协议和静态Web服务器

    HTTP协议和静态Web服务器 3.4.1 HTTP协议 1.HTTP协议介绍 全程:超文本传输协议 作用:规定浏览器和web服务器通信的数据格式 HTTP协议是在应用层的协议,基于传输层的TCP传输 ...

  5. Python 高级:05 HTTP 协议和静态 Web 服务器

    一.HTTP 协议 1. HTTP 协议的介绍 HTTP 协议的全称是(Hyper Text Transfer Protocol),翻译过来就是超文本传输协议.超文本就是超级文本的缩写,是指超越文本限 ...

  6. 自己写一个微型数据库_“最国际化的微型机构:”两名伦敦训练营的毕业生如何建造了一个远程…...

    自己写一个微型数据库 by Rebecca Radding 由丽贝卡·拉丁(Rebecca Radding) "最国际化的微型机构:"两名伦敦训练营毕业生如何与加沙的软件工程师建立 ...

  7. 〖Web全栈开发③〗—HTTP协议和静态web服务器

    HTTP协议和静态web服务器 (一)三次握手和四次挥手 (二)HTTP协议 2.1 HTTP协议的定义 2.2 HTTP协议的组成 (三)搭建python自带静态web服务器 3.1 静态web服务 ...

  8. 很懒了不爱写,一个狮心王的修改器...就写了2个功能,今天有朋友要至少把MP锁了,就再加一项吧..今天修改器写完了,可以下了

    将442E66 连续2字节修改为 90 90就可以锁定技能点,怎么加也够了....培养个全能吧 将5FFF5C 连续2字节修改为 01 ED就可以随意买东西..根本不花钱,不过物品栏金钱显示也变0了. ...

  9. 原来热加载如此简单,手动写一个 Java 热加载吧

    1. 什么是热加载 热加载是指可以在不重启服务的情况下让更改的代码生效,热加载可以显著的提升开发以及调试的效率,它是基于 Java 的类加载器实现的,但是由于热加载的不安全性,一般不会用于正式的生产环 ...

最新文章

  1. C++中extern的使用
  2. mysql 查询临时表列名_为什么mysql会缓存被删除的临时表的列名?
  3. 压力测试+webbench+ab+tsung+siege
  4. 指标体系|四个模型教会你指标体系构建的方法
  5. JUnit5基本用法
  6. REST API之前端跨域访问
  7. 英国电信移除华为设备后,多家运营商继续与华为合作,并达成20亿英镑协议...
  8. 排名前5的iOS测试自动化框架
  9. aliplayer播放器使用
  10. 百度服务器保存信息多久,百度识图会保存图片在服务器上吗?
  11. 简单无迹kalman的matlab程序,卡尔曼滤波原理及应用——MATLAB仿真
  12. 批处理命令——bat文件创建和基本命令语法
  13. 阿里云快照如何恢复到另外一台服务器
  14. Pinbox使用感受
  15. 关于CDN和DNS技术的解析以及搭建智能DNS的方法
  16. JS中对象key为数字的使用
  17. 服务器上的压缩文件怎么解压,什么是压缩文件,如何解压?
  18. matlab求线性方程组的符号解,符号代数线性方程组的MATLAB求解.PPT
  19. ABB机器人 String 的读取和写入
  20. 滥用线程,导致线上线程池被撑爆的一次意外

热门文章

  1. QC —什么是量子计算机?
  2. 2020民泰银行软件测试,2020应届生银行工作一个半月感受
  3. Color Constancy Datasets
  4. 吉信通:如何使用电脑简单的发送短信
  5. j计算机屏幕关闭时间,win7如何设置自动关闭电脑屏幕的时间?
  6. MySQL5.7乱码问题
  7. 微信开发者解除绑定微信公众号的方法,亲测有效
  8. 沈华伟老师图卷积神经网络教学视频笔记
  9. 空间3点求三点所在空间圆的圆心空间坐标
  10. HTML元素分类:inline、inline-block、block