一.WebServer.java文件:
1 package webserver; 2 ?3 import java.io.*; 4 import java.net.*; 5 ?6 public class WebServer { 7 ?8 ????/** 9 ?????* web服务器:实现200和404操作10 ?????* 原理:11 ?????* 服务器监听一个端口,并读取浏览器的请求信息,从该信息提取出访问的资源(这里为文件名)。并在工作目录下查找是否有该资源,有则输出资源内容,否则返回40412 ?????* 测试方法:13 ?????* 1、用String path=System.getProperty("user.dir");获取当前的工作目录,并在该目录下放要测试的文件14 ?????* 2、访问127.0.0.1:8080/test.html15 ?????*/16 ????public static void main(String[] args) {17 ????????// TODO Auto-generated method stub18 ????????ServerSocket server = null;19 ????????Socket s=null;20 ????????try21 ????????{22 ????????????server=new ServerSocket(8080,3,InetAddress.getByName("127.0.0.1"));23 ????????}catch(Exception e)24 ????????{25 ????????????e.printStackTrace();26 ????????}27 ????????while(true)28 ????????{29 ????????????try{30 ????????????????s=server.accept();31 ????????????????OutputStream output=s.getOutputStream();32 ????????????????InputStream input=s.getInputStream();33 ????????????????34 ????????????????//接收请求信息35 ????????????????Request request=new Request(input);36 ????????????????String filename=request.getUri();37 ????????????????//System.out.println(filename);38 ????????????????39 ????????????????//处理并响应请求信息40 ????????????????Response response=new Response(output,filename);41 ????????????????response.response();42 43 ????????????}catch(Exception e)44 ????????????{45 ????????????????e.printStackTrace();46 ????????????}47 ????????}48 ????}49 50 }
二.Request.java内容:
1 package webserver; 2 import java.io.*; 3 public class Request { 4 ????/* 5 ?????* 接收请求的信息,并返回资源(文件名) 6 ?????* */ 7 ????InputStream input; 8 ????public Request(InputStream input) 9 ????{10 ????????this.input=input;11 ????}12 ????public String getUri() throws IOException13 ????{14 ????????String content=null,str=null;15 ????????StringBuffer request = new StringBuffer(); ?16 ????????byte[] buffer = new byte[2048]; ?17 ????????int i = 0; ?18 ??????????19 ????????try { ?20 ????????????i = input.read(buffer); ?//读取内容并存入buffer数组中,并返回读取的的字节数。21 ????????} catch (IOException e) { ?22 ????????????e.printStackTrace(); ?23 ????????????i = -1; ?24 ????????} ?25 ????????//将buffer数组转换为字符串26 ????????for(int k = 0; k < i; k++) { ?27 ????????????request.append((char)buffer[k]); ?28 ????????} ?29 ????????content=request.toString();30 ????/* ???31 ?????*以下方法错误!用该返回会使浏览器不断处于请求连接状态32 ?????* BufferedReader br=new BufferedReader(new InputStreamReader(input));33 ????????while((str=br.readLine())!=null)34 ????????{35 ????????????content=content+str+"\r\n";36 ????????}37 ????*/ ???38 ????????if(content!=null)39 ????????????return getFilename(content);40 ????????else return null;41 ????}42 ????/*提取文件名*/43 ????public String getFilename(String content)44 ????{45 ????????int a,b;46 ????????a=content.indexOf(‘ ‘);47 ????????if(a!=-1)48 ????????{49 ????????????b=content.indexOf(‘?‘,a+1);50 ????????????if(b==-1)b=content.indexOf(‘ ‘,a+1);51 ????????????return content.substring(a+2,b);52 ????????}53 ????????return null;54 ????}55 }
三.Response.java:
1 package webserver; 2 ?3 import java.io.*; 4 import java.io.File; 5 import java.io.IOException; 6 import java.io.OutputStream; 7 ?8 public class Response { 9 ????/**10 ?????* 响应并处理请求信息11 ?????*/12 ????public OutputStream output;13 ????public String filename;14 ?????private static final int BUFFER_SIZE = 1024; 15 ????public ?Response(OutputStream output,String filename)16 ????{17 ????????this.output=output;18 ????????this.filename=filename;19 ????}20 ????public void response() throws IOException21 ????{22 ????????String path=System.getProperty("user.dir");//获取当前的工作目录23 ????????byte[] buffer = new byte[BUFFER_SIZE]; ?24 ????????int ch; ?25 ????????FileInputStream fis = null; ?26 ????????//System.out.println(path+File.separator+filename);27 ????????if(path!=null&&filename!=null)28 ????????{29 ????????????File file=new File(path,filename);30 ????????????String str="";31 ????????????/*必须添加响应头,否则无法以html格式显示内容*/32 ????????????if(file.exists())33 ????????????{34 ????????????????fis = new FileInputStream(file); ?35 ????????????????str = "HTTP/1.1 200 OK \r\n" + ?36 ?????????????????"Content-Type: text/html\r\n" + ?37 ?????????????????"\r\n" ;38 ????????????????output.write(str.getBytes());39 ????????????????ch = fis.read(buffer); ???????????????40 ????????????????while(ch != -1) { ?41 ????????????????????output.write(buffer, 0, ch); ?42 ????????????????????ch = fis.read(buffer, 0, BUFFER_SIZE); ?43 ????????????????} ?44 ????????????}45 ????????????else46 ????????????{47 ?????????????????str = "HTTP/1.1 404 File Not Found \r\n" + ?48 ?????????????????"Content-Type: text/html\r\n" + ?49 ?????????????????"Content-Length: 100\r\n" + ?50 ?????????????????"\r\n" + ?51 ?????????????????"<h1>404 File Not Found!</h1>"; 52 ????????????????output.write(str.getBytes());53 ????????????}54 ????????}55 ????????output.close();56 ????}57 }
四.测试效果:
五.web服务器原理简介:
(详情参考:https://blog.csdn.net/qq_36359022/article/details/81666221)
过程介绍:
(1) 用户做出了一个操作,可以是填写网址敲回车,可以是点击链接,可以是点击按键等,接着浏览器获取了该事件。
(2) 浏览器与对端服务程序建立TCP连接。
(3) 浏览器将用户的事件按照HTTP协议格式**打包成一个数据包,其实质就是在待发送缓冲区中的一段有着HTTP协议格式的字节流。
(4) 浏览器确认对端可写,并将该数据包推入Internet,该包经过网络最终递交到对端服务程序。
(5) 服务端程序拿到该数据包后,同样以HTTP协议格式解包,然后解析客户端的意图。
(6) 得知客户端意图后,进行分类处理,或是提供某种文件、或是处理数据。
(7) 将结果装入缓冲区,或是HTML文件、或是一张图片等。
(8) 按照HTTP协议格式将(7)中的数据打包
(9) 服务器确认对端可写,并将该数据包推入Internet,该包经过网络最终递交到客户端。
(10) 浏览器拿到包后,以HTTP协议格式解包,然后解析数据,假设是HTML文件。
(11) 浏览器将HTML文件展示在页面
以上为Web服务器工作基本原理。其实不难发现,这仅仅只是一个简单的网络通信。我们应该深信,作为一个服务器,其根本的工作无非有三个:
1.接收数据 2. 发送数据 3. 数据处理
而Web服务器的本质就是 接收数据 ⇒ HTTP解析 ⇒ 逻辑处理 ⇒ HTTP封包 ⇒ 发送数据
高级的服务器无非就是将这三个部分更加细致的设计了。
web服务器原理
原文地址:https://www.cnblogs.com/lyq-biu/p/10538651.html