码迷,mamicode.com
首页 > Web开发 > 详细

web服务器

时间:2018-08-25 21:49:57      阅读:245      评论:0      收藏:0      [点我收藏+]

标签:http协议   name   down   oid   byte   address   虚拟   substring   客户端   

web服务器也称为www(world wide web)服务器,主要功能是提供网上信息浏览服务。web服务器是可以向发出请求的浏览器提供文档的程序。

  1. 服务器是一种被动程序:只有当Internet上运行其他计算机中的浏览器发出的请求时,服务器才会响应
  2. 最常用的web服务器是Apache和Nginx、IIS。
  3. web服务器是指驻留于因特网上某种类型计算机的程序。当web浏览器(客户端)连到服务器上并请求文件时,服务器将处理该请求并将文件反馈到该浏览器上,附带的信息会告诉浏览器如何查看该文件(即文件类型)。服务器使用HTTP(超文本传输协议)与客户机浏览器进行信息交流,这就是人们常把它们称为HTTP服务器的原因。
  4. Internet上的服务器也称为Web服务器,是一台在Internet上具有独立IP地址的计算机,可以向Internet上的客户机提供WWW、Email和FTP等各种Internet服务。
  5. Web服务器不仅能够存储信息,还能在用户通过Web浏览器提供的信息的基础上运行脚本和程序。

协议

  1. 应用层使用HTTP协议。
  2. HTML(标准通用标记语言下的一个应用)文档格式。
  3. 浏览器统一资源定位器(URL)。
  4. 为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS。为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。

工作原理

  一般可分成如下4个步骤:连接过程、请求过程、应答过程以及关闭连接。下面对这4个步骤作一简单的介绍。

  • 连接过程就是Web服务器和其浏览器之间所建立起来的一种连接。查看连接过程是否实现,用户可以找到和打开socket这个虚拟文件,这个文件的建立意味着连接过程这一步骤已经成功建立。
  • 请求过程就是Web的浏览器运用socket这个文件向其服务器而提出各种请求。
  • 应答过程就是运用HTTP协议把在请求过程中所提出来的请求传输到Web的服务器,进而实施任务处理,然后运用HTTP协议把任务处理的结果传输到Web的浏览器,同时在Web的浏览器上面展示上述所请求之界面。
  • 关闭连接就是当上一个步骤--应答过程完成以后,Web服务器和其浏览器之间断开连接之过程。

Web服务器上述4个步骤环环相扣、紧密相联,逻辑性比较强,可以支持多个进程、多个线程以及多个进程与多个线程相混合的技术。

 


服务器一般可以用c语言、Java、Python来写主体框架。以下用Java写在windows10的服务器。

服务器的不同写法从根本上都是遵循同一套网络协议的,在网络上传递的数据是完全一致的,对于客户端而言,服务器的具体写法并不影响消息的传递。

 

web服务器最基本功能:

  • 处理HTTP请求
  • 返回HTTP响应

在设计服务器功能时,可以分为三块,用三个类来写:

  • 主类HttpServer——代表服务器对象,负责服务器属性和行为
  • 请求类Request——代表请求对象,负责处理接收的客户端的请求数据
  • 响应类Response——代表响应对象,负责处理返回给客户端的响应数据

主类HttpServer

import java.net.Socket;  
import java.net.ServerSocket;  
import java.net.InetAddress;  
import java.io.InputStream;  
import java.io.OutputStream;  
import java.io.IOException;  
import java.io.File;  
  
public class HttpServer {  
  
    public static final String WEB_ROOT = System.getProperty("user.dir")  
            + File.separator + "webroot";  
  
    private static final String SHUTDOWN_COMMAND = "/SHUTDOWN";  
  
    private boolean shutdown = false;  
  
    public static void main(String[] args) {  
        HttpServer server = new HttpServer();  
        server.await();  
    }  
  
    public void await() {  
        ServerSocket serverSocket = null;  
        int port = 8080;  
        try {  
            serverSocket = new ServerSocket(port, 1,  
                    InetAddress.getByName("127.0.0.1"));  
        } catch (IOException e) {  
            e.printStackTrace();  
            System.exit(1);  
        }  
  
        while (!shutdown) {  
            Socket socket = null;  
            InputStream input = null;  
            OutputStream output = null;  
            try {  
                socket = serverSocket.accept();  
                input = socket.getInputStream();  
                output = socket.getOutputStream();  
  
                Request request = new Request(input);  
                request.parse();  
  
                Response response = new Response(output);  
                response.setRequest(request);  
                response.sendStaticResource();  
  
                socket.close();  
  
                shutdown = request.getUri().equals(SHUTDOWN_COMMAND);  
            } catch (Exception e) {  
                e.printStackTrace();  
                continue;  
            }  
        }  
    }  
}  

 

请求类Request

import java.io.InputStream;  
import java.io.IOException;  
  
public class Request {  
  
    private InputStream input;  
    private String uri;  
  
    public Request(InputStream input) {  
        this.input = input;  
    }  
  
    public void parse() {  
  
        StringBuffer request = new StringBuffer(2048);  
        int i;  
        byte[] buffer = new byte[2048];  
        try {  
            i = input.read(buffer);  
        } catch (IOException e) {  
            e.printStackTrace();  
            i = -1;  
        }  
        for (int j = 0; j < i; j++) {  
            request.append((char) buffer[j]);  
        }  
        System.out.print(request.toString());  
        uri = parseUri(request.toString());  
    }  
  
    private String parseUri(String requestString) {  
        int index1, index2;  
        index1 = requestString.indexOf(‘ ‘);  
        if (index1 != -1) {  
            index2 = requestString.indexOf(‘ ‘, index1 + 1);  
            if (index2 > index1)  
                return requestString.substring(index1 + 1, index2);  
        }  
        return null;  
    }  
  
    public String getUri() {  
        return uri;  
    }  
  
}  

 

响应类Response

import java.io.OutputStream;  
import java.io.IOException;  
import java.io.FileInputStream;  
import java.io.File;  
  
public class Response {  
  
    private static final int BUFFER_SIZE = 1024;  
    Request request;  
    OutputStream output;  
  
    public Response(OutputStream output) {  
        this.output = output;  
    }  
  
    public void setRequest(Request request) {  
        this.request = request;  
    }  
  
    public void sendStaticResource() throws IOException {  
        byte[] bytes = new byte[BUFFER_SIZE];  
        FileInputStream fis = null;  
        try {  
            File file = new File(HttpServer.WEB_ROOT, request.getUri());  
            if (file.exists()) {  
                fis = new FileInputStream(file);  
                int ch = fis.read(bytes, 0, BUFFER_SIZE);  
                while (ch != -1) {  
                    output.write(bytes, 0, ch);  
                    ch = fis.read(bytes, 0, BUFFER_SIZE);  
                }  
            } else {  
                  
                String errorMessage = "HTTP/1.1 404 File Not Found\r\n"  
                        + "Content-Type: text/html\r\n"  
                        + "Content-Length: 23\r\n" + "\r\n"  
                        + "<h1>File Not Found</h1>";  
                output.write(errorMessage.getBytes());  
            }  
        } catch (Exception e) {  
              
            System.out.println(e.toString());  
        } finally {  
            if (fis != null)  
                fis.close();  
        }  
    }  
}  

 

web服务器

标签:http协议   name   down   oid   byte   address   虚拟   substring   客户端   

原文地址:https://www.cnblogs.com/heibaimao123/p/9535446.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!