概述: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服务器的原理
原文地址:https://www.cnblogs.com/zwx-code/p/10540043.html