动手打造轻量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

是不是很简单呢

浙公网安备 33010602011771号