web服务器的原理
Posted 钟万祥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了web服务器的原理相关的知识,希望对你有一定的参考价值。
概述:Web服务器概念较为广泛,我们最常说的Web服务器指的是网站服务器,它是建立在Internet之上并且驻留在某种计算机上的程序。Web服务器可以向Web客户端(如浏览器)提供文档或其他服务,只要是遵循HTTP协议而设计的网络应用程序都可以是Web客户端。
Web服务器和HTTP服务器可以说是同一个东西,当然非得细分的话,HTTP服务器是建立在HTTP协议之上的提供文档浏览的服务器,更多的是提供静态的文件。而Web服务器涵盖了HTTP服务器(这一点可以自行百度百科), Web服务器不仅能够存储信息,还能在用户通过Web浏览器提供的信息的基础上运行脚本和程序。
Web服务器工作原理图解
Web服务器之提供静态文件工作原理图解
Web服务器之数据提交工作原理图解
参考https://www.cnblogs.com/yingww/p/4097620.htm实现了一个简单的webserver
1、WebServer.java文件
package webserver; import java.io.*; import java.net.*; public class WebServer { /** * web服务器:实现200和404操作 * 原理: * 服务器监听一个端口,并读取浏览器的请求信息,从该信息提取出访问的资源(这里为文件名)。并在工作目录下查找是否有该资源,有则输出资源内容,否则返回404 * 测试方法: * 1、用String path=System.getProperty("user.dir");获取当前的工作目录,并在该目录下放要测试的文件 * 2、访问127.0.0.1:8080/test.html */ public static void main(String[] args) { // TODO Auto-generated method stub ServerSocket server = null; Socket s=null; try { server=new ServerSocket(8080,3,InetAddress.getByName("127.0.0.1")); }catch(Exception e) { e.printStackTrace(); } while(true) { try{ s=server.accept(); OutputStream output=s.getOutputStream(); InputStream input=s.getInputStream(); //接收请求信息 Request request=new Request(input); String filename=request.getUri(); //System.out.println(filename); //处理并响应请求信息 Response response=new Response(output,filename); response.response(); }catch(Exception e) { e.printStackTrace(); } } } }
2、Request.java
package webserver; import java.io.*; public class Request { /* * 接收请求的信息,并返回资源(文件名) * */ InputStream input; public Request(InputStream input) { this.input=input; } public String getUri() throws IOException { String content=null,str=null; StringBuffer request = new StringBuffer(); byte[] buffer = new byte[2048]; int i = 0; try { i = input.read(buffer); //读取内容并存入buffer数组中,并返回读取的的字节数。 } catch (IOException e) { e.printStackTrace(); i = -1; } //将buffer数组转换为字符串 for(int k = 0; k < i; k++) { request.append((char)buffer[k]); } content=request.toString(); /* *以下方法错误!用该返回会使浏览器不断处于请求连接状态 * BufferedReader br=new BufferedReader(new InputStreamReader(input)); while((str=br.readLine())!=null) { content=content+str+"\\r\\n"; } */ if(content!=null) return getFilename(content); else return null; } /*提取文件名*/ public String getFilename(String content) { int a,b; a=content.indexOf(\' \'); if(a!=-1) { b=content.indexOf(\'?\',a+1); if(b==-1)b=content.indexOf(\' \',a+1); return content.substring(a+2,b); } return null; } }
3、Response.java
package webServer; import java.io.*; import java.io.File; import java.io.IOException; import java.io.OutputStream; public class Response { /** * 响应并处理请求信息 */ public OutputStream output; public String filename; private static final int BUFFER_SIZE = 1024; public Response(OutputStream output,String filename) { this.output=output; this.filename=filename; } public void response() throws IOException { String path=System.getProperty("user.dir");//获取当前的工作目录 byte[] buffer = new byte[BUFFER_SIZE]; int ch; FileInputStream fis = null; //System.out.println(path+File.separator+filename); if(path!=null&&filename!=null) { File file=new File(path,filename); String str=""; /*必须添加响应头,否则无法以html格式显示内容*/ if(file.exists()) { fis = new FileInputStream(file); str = "HTTP/1.1 200 OK \\r\\n" + "Content-Type: text/html\\r\\n" + "\\r\\n" ; output.write(str.getBytes()); ch = fis.read(buffer); while(ch != -1) { output.write(buffer, 0, ch); ch = fis.read(buffer, 0, BUFFER_SIZE); } } else { str = "HTTP/1.1 404 File Not Found \\r\\n" + "Content-Type: text/html\\r\\n" + "Content-Length: 100\\r\\n" + "\\r\\n" + "<h1>404 File Not Found!</h1>"; output.write(str.getBytes()); } } output.close(); } }
运行结果
以上是关于web服务器的原理的主要内容,如果未能解决你的问题,请参考以下文章