tomcat启动慢?自己动手打造轻量web服务器(一)

  上篇讲了怎么做一个最简单的web服务器,这篇就是在上篇加上URL路由功能(什么是路由?)

首先,根据http获得请求行

  1. val scanner = Scanner(socket.getInputStream())
  2. scanner.use { it ->
  3. val requestLine = it.nextLine()//获得请求行
  4. socket.getOutputStream().use { out ->//将请求行传会浏览器
  5. out.write("HTTP/1.1 200 OK".toByteArray())
  6. out.write("\n".toByteArray())
  7. out.write(("content-type:text/html").toByteArray())
  8. out.write("\n".toByteArray())
  9. out.write("\n".toByteArray())
  10. out.write(requestLine.toByteArray())
  11. out.flush()
  12. }
  13. }

此时在浏览器上打开,就会打印出请求行。

接下来我们来做一个静态资源的访问

  1. import java.io.File
  2. import java.net.ServerSocket
  3. import java.util.*
  4.  
  5. fun main(args: Array<String>) {
  6. val workerSpace = "workerSpace"//工作空间
  7. val port = 80//端口
  8. ServerSocket(port).let { serverSocket ->
  9. while (!serverSocket.isClosed) {//不间断接收accept请求
  10. serverSocket.accept().let { socket ->
  11. Thread {
  12. Scanner(socket.getInputStream())
  13. .use { scanner ->
  14. val requestLine = scanner.nextLine()//获得请求行
  15. val url = requestLine.trim().split(" ")[1]//获得请求url
  16. val filePath = workerSpace + url//文件路径
  17. File(filePath).let { file ->
  18. if (file.isFile) {//找到文件
  19. socket.getOutputStream().use { out ->
  20. out.write("HTTP/1.1 200 OK".toByteArray())//响应行
  21. out.write("\n".toByteArray())//换行符
  22. val contentType = when (file.extension.toLowerCase()) {
  23. "css" -> "text/css"
  24. "js" -> "text/javascript"
  25. "html" -> "text/html"
  26. "plain" -> "text/plain"
  27. "json" -> "application/json"
  28. "xls" -> "application/vnd.ms-excel"
  29. else -> "application/octet-stream"
  30. }
  31. //响应头
  32. out.write("content-type:$contentType".toByteArray())
  33. out.write("\n".toByteArray())
  34. out.write("content-length:${file.length()}".toByteArray())
  35. //注意这里需要两个换行符
  36. out.write("\n\n".toByteArray())
  37. out.write(file.readBytes())//响应体
  38. }
  39. } else {//没有找到资源404
  40. socket.getOutputStream().use { out ->
  41. out.write("HTTP/1.1 404".toByteArray())
  42. out.write("\n".toByteArray())
  43. out.write("content-type : text/html".toByteArray())
  44. //注意这里需要两个换行符
  45. out.write("\n\n".toByteArray())
  46. out.write("<h1>not found</h1>".toByteArray())
  47. }
  48. }
  49. }
  50. }
  51. }.start()
  52. }
  53. }
  54. }
  55. }

在程序工作目录下新建文件夹叫workerSpace,在其中放入index.html

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

是不是很简单呢

动手打造轻量web服务器(二)路由的更多相关文章

  1. tomcat启动慢?自己动手打造轻量web服务器(一)

    废话少说,直接上代码. 编程语言:kotlin import java.net.ServerSocketimport java.net.Socket fun main(args:Array<St ...

  2. 【转载】阿里云轻量应用型服务器和ECS服务器比较

    在采购阿里云服务器的时候,我们会发现阿里云服务器分好多种,如GPU服务器.ECS服务器.轻量应用型服务器等.ECS服务器和轻量应用型服务器很多人无法搞明白其中的差别,个人的观点是轻量应用型服务器适合入 ...

  3. 初识python轻量web框架flask

    1.使用pip安装Python包 大多数Python包都使用pip实用工具安装,使用pyvenv创建的虚拟环境会自动安装pip. 1.使用pip安装Flask(其它Python包同理) pip ins ...

  4. express搭建web服务器、路由、get、post请求、multer上传文件、EJS模板引擎的使用

    express官网 postman工具下载地址  multer的npm文档地址 express模板引擎怎么使用  地址:http://www.expressjs.com.cn/guide/using- ...

  5. 最小安装centos 7 无GUI静默安装 oracle 12c,打造轻量linux化服务器

    CentOS 7 下载地址:http://mirrors.opencas.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1511.iso 一.安 ...

  6. OSCHina技术导向:Java轻量web开发框架——JFinal

    JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展.Restful.在拥有Java语言所有优势的同时再拥有ru ...

  7. MVC轻量web应用

    前言:为了能够清晰的理解mvc架构,以一个简单的mvc架构web应用为例.例子为一个beer项目,用户可通过页面选择啤酒的种类,服务端根据用户的选择,给出相应的推荐. 涉及到的代码: view层:fo ...

  8. Python轻量Web框架Flask使用

    http://blog.csdn.net/jacman/article/details/49098819 目录(?)[+] Flask安装 Python开发工具EclipsePyDev准备 Flask ...

  9. 轻量ORM-SqlRepoEx (二)初始化SqlRepoEx

    一.SqlRepoEx引用 暂时没放至nuget上,可以直接到https://github.com/AzThinker/SqlRepoEx下载源码,编译引用. (一).静态引用 1.需引用以下dll在 ...

随机推荐

  1. MySQL 数据库--索引原理与慢查询优化

    索引的原理 本质都是:通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数据. 索引的数据结构 b+ ...

  2. execl execv

    int execl(const char *path, const char *arg, ...); 函数说明 execl()其中后缀"l"代表list也就是参数列表的意思第一参数 ...

  3. Cinder组件解析

    1  Cinder架构图 Cinder是在虚拟机和具体存储设备之间引入了一层“逻辑存储卷”的抽象,Cinder本身并不是一种存储技术,只是提供一个中间的抽象层,Cinder通过调用不同存储后端类型的驱 ...

  4. Angular组件之间通讯

    组件之间会有下列3种关系: 1. 父子关系 2. 兄弟关系 3. 没有直接关系 通常采用下列方式处理(某些方式是框架特有)组件间的通讯,如下: 1父子组件之间的交互(@Input/@Output/模板 ...

  5. yii2.0 rules 规则中场景验证字段

    除了app场景以外的其他场景都验证uid字段['uid', 'required','except'=>'app', 'message' => '参数错误'], 只有app场景验证uid字段 ...

  6. TensorFlow函数(三)tf.variable_scope() 和 tf.name_scope()

    tf.name_scope() 此函数作用是共享变量.在一个作用域scope内共享一些变量,简单来说,就是给变量名前面加个变量空间名,只限于tf.Variable()的变量 tf.variable_s ...

  7. [LuoguP1363]幻想迷宫

    [LuoguP1363]幻想迷宫(Link) 现在有一个迷宫,从迷宫边界的任意一点可以走到对面,即:若都是路面,则可以从\((1, i)\)走到\((N, i)\).其余情况依旧.问是否可以从指定的起 ...

  8. HDU 1050(楼道搬桌子问题)(不是贪心解法,思路很新颖)

    Moving Tables Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  9. 关于iPad上模态显示视图中的UITextField,UITextView在输入完成后无法回收键盘的问题解决。

    在iPad开发过程中遇到一个问题,UITextField 存在由UIModalPresentationFormSheet 弹出的带导航条的视图控制器中时,调用 resignFirstResponder ...

  10. winrar 弹窗处理

    https://www.rarlab.com/ 1.下载英文版 2.把下面这段code文本复制到一个新建的记事本txt文档中,然后另存为rarreg.key文件,注意后缀名.txt改为.key才行. ...