动手打造轻量web服务器(二)路由
上篇讲了怎么做一个最简单的web服务器,这篇就是在上篇加上URL路由功能(什么是路由?)
首先,根据http获得请求行
val scanner = Scanner(socket.getInputStream())
scanner.use { it ->
val requestLine = it.nextLine()//获得请求行
socket.getOutputStream().use { out ->//将请求行传会浏览器
out.write("HTTP/1.1 200 OK".toByteArray())
out.write("\n".toByteArray())
out.write(("content-type:text/html").toByteArray())
out.write("\n".toByteArray())
out.write("\n".toByteArray())
out.write(requestLine.toByteArray())
out.flush()
}
}
此时在浏览器上打开,就会打印出请求行。
接下来我们来做一个静态资源的访问
import java.io.File
import java.net.ServerSocket
import java.util.* fun main(args: Array<String>) {
val workerSpace = "workerSpace"//工作空间
val port = 80//端口
ServerSocket(port).let { serverSocket ->
while (!serverSocket.isClosed) {//不间断接收accept请求
serverSocket.accept().let { socket ->
Thread {
Scanner(socket.getInputStream())
.use { scanner ->
val requestLine = scanner.nextLine()//获得请求行
val url = requestLine.trim().split(" ")[1]//获得请求url
val filePath = workerSpace + url//文件路径
File(filePath).let { file ->
if (file.isFile) {//找到文件
socket.getOutputStream().use { out ->
out.write("HTTP/1.1 200 OK".toByteArray())//响应行
out.write("\n".toByteArray())//换行符
val contentType = when (file.extension.toLowerCase()) {
"css" -> "text/css"
"js" -> "text/javascript"
"html" -> "text/html"
"plain" -> "text/plain"
"json" -> "application/json"
"xls" -> "application/vnd.ms-excel"
else -> "application/octet-stream"
}
//响应头
out.write("content-type:$contentType".toByteArray())
out.write("\n".toByteArray())
out.write("content-length:${file.length()}".toByteArray())
//注意这里需要两个换行符
out.write("\n\n".toByteArray())
out.write(file.readBytes())//响应体
}
} else {//没有找到资源404
socket.getOutputStream().use { out ->
out.write("HTTP/1.1 404".toByteArray())
out.write("\n".toByteArray())
out.write("content-type : text/html".toByteArray())
//注意这里需要两个换行符
out.write("\n\n".toByteArray())
out.write("<h1>not found</h1>".toByteArray())
}
}
}
}
}.start()
}
}
}
}
在程序工作目录下新建文件夹叫workerSpace,在其中放入index.html

运行程序,在浏览器上输入127.0.0.1/[文件路径/]index.html

是不是很简单呢
动手打造轻量web服务器(二)路由的更多相关文章
- tomcat启动慢?自己动手打造轻量web服务器(一)
废话少说,直接上代码. 编程语言:kotlin import java.net.ServerSocketimport java.net.Socket fun main(args:Array<St ...
- 【转载】阿里云轻量应用型服务器和ECS服务器比较
在采购阿里云服务器的时候,我们会发现阿里云服务器分好多种,如GPU服务器.ECS服务器.轻量应用型服务器等.ECS服务器和轻量应用型服务器很多人无法搞明白其中的差别,个人的观点是轻量应用型服务器适合入 ...
- 初识python轻量web框架flask
1.使用pip安装Python包 大多数Python包都使用pip实用工具安装,使用pyvenv创建的虚拟环境会自动安装pip. 1.使用pip安装Flask(其它Python包同理) pip ins ...
- express搭建web服务器、路由、get、post请求、multer上传文件、EJS模板引擎的使用
express官网 postman工具下载地址 multer的npm文档地址 express模板引擎怎么使用 地址:http://www.expressjs.com.cn/guide/using- ...
- 最小安装centos 7 无GUI静默安装 oracle 12c,打造轻量linux化服务器
CentOS 7 下载地址:http://mirrors.opencas.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1511.iso 一.安 ...
- OSCHina技术导向:Java轻量web开发框架——JFinal
JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展.Restful.在拥有Java语言所有优势的同时再拥有ru ...
- MVC轻量web应用
前言:为了能够清晰的理解mvc架构,以一个简单的mvc架构web应用为例.例子为一个beer项目,用户可通过页面选择啤酒的种类,服务端根据用户的选择,给出相应的推荐. 涉及到的代码: view层:fo ...
- Python轻量Web框架Flask使用
http://blog.csdn.net/jacman/article/details/49098819 目录(?)[+] Flask安装 Python开发工具EclipsePyDev准备 Flask ...
- 轻量ORM-SqlRepoEx (二)初始化SqlRepoEx
一.SqlRepoEx引用 暂时没放至nuget上,可以直接到https://github.com/AzThinker/SqlRepoEx下载源码,编译引用. (一).静态引用 1.需引用以下dll在 ...
随机推荐
- Excel开发之旅(三)——添加侧边工具栏
1. 添加自定义用户控件:选择项目添加新建项用户控件.修改文件名,点击添加即可. 2. 重复步骤1,再添加3个自定义控件,接下来我们在自定义用户控件上面添加一些工具箱组件 3. 由于我们添加的是侧边工 ...
- C#3.0新特性:隐式类型、扩展方法、自动实现属性,对象/集合初始值设定、匿名类型、Lambda,Linq,表达式树、可选参数与命名参数
一.隐式类型var 从 Visual C# 3.0 开始,在方法范围中声明的变量可以具有隐式类型var.隐式类型可以替代任何类型,编译器自动推断类型. 1.var类型的局部变量必须赋予初始值,包括匿名 ...
- 对1001. A+B Format (20)的描述
Github仓库的链接 https://github.com/deepYY/object-oriented/blob/master/A-B-Format/A.B.Format.c 解题思路: 输入a, ...
- JavaScript设计模式导学
如何成为一名合格的工程师? 作为一名合格的工程师,不仅需要懂代码,还要懂设计,一名合格工程师的必备条件: 前端开发有一定的设计能力,一般三年开发经验的同学,面试必须考设计能力 成为项目技术负责人,设计 ...
- redis和mecache和ehcache的特点
最近项目组有用到这三个缓存,去各自的官方看了下,觉得还真的各有千秋!今天特意归纳下各个缓存的优缺点,仅供参考! Ehcache 在java项目广泛的使用.它是一个开源的.设计于提高在数据从RDBMS中 ...
- ARM汇编之MOV指令
http://blog.csdn.net/lsywk/article/details/8799837 一.指令格式 MOV{条件}{S} 目的寄存器,源操作数 二.指令详解 MOV指令可完成从另一个 ...
- TensorFlow函数(五)参数初始化方法
1.初始化为常量 tf.constant_initializer(value, dtype) 生成一个初始值为常量value的tensor对象 value:指定的常量 dtype:数据类型 tf.ze ...
- java反序列化Commons-Collections1分析
AnnotationInvocationHandler关键类 Commons-Collections1也是利用InvokerTransformer类中的transform方法反射机制执行命令.实验用的 ...
- springboot+maven——打war包方式
转载 Springboot打包war包部署到自己的tomcat中 一.springboot+maven工程——打war包步骤如下: 1.修改父pom.xml文件: <packaging>p ...
- PHP扩展功能 ---- 页面静态化(OB缓冲)
一.入门三部曲 1.什么是页面静态化 百度百科介绍: 静态页面是网页的代码都在页面中,不需要执行asp,php,jsp,.net等程序生成客户端网页代码的网页,静态页面网址中一般不含"?&q ...