web服务器也称为www(world wide web)服务器,主要功能是提供网上信息浏览服务。web服务器是可以向发出请求的浏览器提供文档的程序。
- 服务器是一种被动程序:只有当Internet上运行其他计算机中的浏览器发出的请求时,服务器才会响应。
- 最常用的web服务器是Apache和Nginx、IIS。
- web服务器是指驻留于因特网上某种类型计算机的程序。当web浏览器(客户端)连到服务器上并请求文件时,服务器将处理该请求并将文件反馈到该浏览器上,附带的信息会告诉浏览器如何查看该文件(即文件类型)。服务器使用HTTP(超文本传输协议)与客户机浏览器进行信息交流,这就是人们常把它们称为HTTP服务器的原因。
- Internet上的服务器也称为Web服务器,是一台在Internet上具有独立IP地址的计算机,可以向Internet上的客户机提供WWW、Email和FTP等各种Internet服务。
- Web服务器不仅能够存储信息,还能在用户通过Web浏览器提供的信息的基础上运行脚本和程序。
协议
- 应用层使用HTTP协议。
- HTML(标准通用标记语言下的一个应用)文档格式。
- 浏览器统一资源定位器(URL)。
- 为了解决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服务器
原文地址:https://www.cnblogs.com/heibaimao123/p/9535446.html