动手打造轻量web服务器(二)路由

tomcat启动慢?自己动手打造轻量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

 

 

是不是很简单呢

posted @ 2019-03-05 17:24  augus林森  阅读(387)  评论(0)    收藏  举报