一个最简单的static web server

  声明:资料来自Tomcat剖析一书,该程序是基于java socket的,socket和stream类作为概念背景,现在仅仅是使用其作为基础类,并不关注其本身,关注点在一个服务器的外部功能和体系结构!

  • 代码目录

  

  • HttpServer

package simpleserver;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * 说明:   server该服务亲自管理request,和response,当前服务只是一个静态资源服务;
 *         request用来解析请求的数据流,抽象成请求对象
 *         response根据请求路径到根目录寻找资源,并输出;该程序的响应只有响应体
 *
 * 作为一个静态服务器,该程序还需要完善:响应对象本身
 * @author Administrator
 *
 */
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) {
        System.out.println("打印输出web_root"+WEB_ROOT);
        HttpServer serverSocket = new HttpServer();
        serverSocket.await();  //服务启动
    }

    public void await() {
        ServerSocket serverSocket = null;
        int port = 8080;
        try {
            serverSocket = new ServerSocket(port, 1, InetAddress.getByName("192.168.1.102"));//绑定服务的端口号,连接数量,要连接该服务的地址
        }catch(IOException e) {
            e.printStackTrace();
            System.exit(1);
        }
        while(!shutdown) {
            Socket socket = null;
            InputStream input = null;
            OutputStream output = null;
            try {
                socket = serverSocket.accept();               //1在此监听,阻塞
                input = socket.getInputStream();
                output = socket.getOutputStream();
                Request request = new Request(input);       //2把数据传递给request,令其解析;请求使用socket的输入流
                request.parse();
                Response response = new Response(output);   //3响应对象根据已解析的请求路径,寻找资源;响应使用socket的输出流
                response.setRequest(request);
                response.sendStaticResource();
                socket.close();                                //4发回响应后socket关闭;服务还在
                shutdown = request.getUri().equals(SHUTDOWN_COMMAND);
            }
            catch(Exception e) {
                e.printStackTrace();
                continue;
            }

        }

    }
}

  • Request

package simpleserver;

import java.io.IOException;
import java.io.InputStream;
/**
 * @说明:对socket类的inputStream进行解析后生成诸多属性,隶属于该类
 * @author Administrator
 *
 */
public class Request {
    private InputStream input;
    private String uri;

    public Request(InputStream input) {
        this.input = input;
    }

    public String getUri() {
        return uri;
    }

    public void parse() {
        StringBuffer request = new StringBuffer();
        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.println(request.toString());
        uri = parseUri(request.toString());
        System.out.println("截取出来的路径"+uri);
    }
    private String parseUri(String requestString) { //只解析出请求数据中的uri属性
        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;
    }

}

  • Response

package simpleserver;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;

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());    //1根目录拼接请求路径
            System.out.println("请求路径"+file.getAbsolutePath());
            if(file.exists()){
                System.out.println("文件存在");
                fis = new FileInputStream(file);
                int ch = fis.read(bytes, 0, BUFFER_SIZE);
                while(ch!=-1){
                    output.write(bytes, 0, ch);                             //2.1请求的响应数据写入输出流
                    ch = fis.read(bytes, 0, BUFFER_SIZE);
                }
            }
            else {
                String errorMessage = "HTTP/1.1 404 File Not Found\r\n"     //2.2响应数据写入输出流
                        + "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();
            }
        }

    }

}

原文地址:https://www.cnblogs.com/10000miles/p/9211231.html

时间: 2024-10-03 08:28:54

一个最简单的static web server的相关文章

一个网站的诞生07-- Tornado Web Server

用Spider抓取数据,然后再做各种处理,然后放到web页面供大家使用. 那么,就需要一个Web Server. 几乎每种语言都有一大堆Web Server开发框架,Python也不例外,比如这里http://www.zhihu.com/question/20706333.廖雪峰同学还有个python的教程http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0014023080708

一个较丰满的servlet web server,包含conector、Processor、bootstrap (2代码分析)

代码分析: 类关系: BootStrap主程序负责服务器的启动,控制HttpConnector组件: HttpConnector类负责Http链接和线程管理,控制HttpProcessor组件: HttpProcessor类负责Http协议的解析和res/req的创建,同包下的其他类是为解析req解耦出来的相关类,为获取响应writer的相关类:request对象属性在本应用中的到 近乎完全的解析,response好像只可以用writer由程序员自行设置响应头?书上没做说明,自己看代码也无法从静

如何用socket构建一个简单的Web Server

背景 现代社会网络应用随处可见,不管我们是在浏览网页.发送电子邮件还是在线游戏都离不开网络应用程序,网络编程正在变得越来越重要 目标 了解web server的核心思想,然后自己构建一个tiny web server,它可以为我们提供简单的静态网页 最终效果 完整的事例代码可以查看这里 如何运行 python3 index.py 注意 我们假设你已经学习过Python的系统IO.网络编程.Http协议,如果对此不熟悉,可以点击这里的Python教程进行学习,可以点击这里的Http协议进行学习,事

一个简单的Java web服务器实现

一个简单的Java web服务器实现,比较简单,基于java.net.Socket和java.net.ServerSocket实现: 程序执行步骤 创建一个ServerSocket对象: 调用ServerSocket对象的accept方法,等待连接,连接成功会返回一个Socket对象,否则一直阻塞等待: 从Socket对象中获取InputStream和OutputStream字节流,这两个流分别对应request请求和response响应: 处理请求:读取InputStream字节流信息,转成字

一个简单的java web 项目

本文实现一个简单的 java web 项目,包括以下5个功能: 1. 登录 用户默认主页index.jsp , 可选择登录功能,输入用户名和密码,若登录成功,则进入产品管理总页面main.jsp.若不成功仍退回index.jsp 2. 注册 用户默认主页index.jsp ,  可选择注册功能 ,若注册,则进入 register.jsp 3. 管理产品(增加,删除,查看) 登录成功后,进入产品管理总页面main.jsp.第一次进入main.jsp,默认显示所有产品列表.在此页面上更实现 查询某个

Tomcat是怎么工作的(2) -- 动手实现山寨版的简单Web Server

本文先讲解一下Java web server都是怎么工作的.web server也叫HTTP server——顾名思义它是用HTTP协议和客户端交互的.客户端一般就是各种各样的浏览器了.相信所有朋友都清楚这个基本事实,否则你也不会看到这个系列文章了. 基于Java的web server必然用到两个极其重要的类:java.net.Socket和java.net.ServerSocket,然后以HTTP消息进行交互. 1. HTTP协议简介(The Hypertext Transfer Protoc

Nodejs 入门秘籍,搭一个最简单的web服务器。(菜鸟的你也能秒懂)

心血来潮,总结了一个Nodejs入门秘籍.看了你就想学NodeJs了. 一.简单介绍nodejs 初学nodejs  ,直接上简单实例.先简单说明一下:nodejs ,nodejs相当于服务器端的 可以轻易搭建一个服务器端. nodejs是用C++开发的一种运行于服务器端的语言,可以写网站后台程序,可以做服务端应用开发,语法和JAVASCRIPT一样,会JS,就是会NodeJS,区别于,普通JS是脚本运行客户端,而NODEJS中的JS是运行于服务器端,NODEJS的作用相当PHP,ASP等语言.

Nginx一个实现负载均衡的强大web server

<转>nginx 这个轻量级.高性能的 web server 主要可以干两件事情: 〉直接作为http server(代替apache,对PHP需要FastCGI处理器支持): 〉另外一个功能就是作为反向代理服务器实现负载均衡 以下我们就来举例说明如何使用 nginx 实现负载均衡.因为nginx在处理并发方面的优势,现在这个应用非常常见.当然了Apache的 mod_proxy和mod_cache结合使用也可以实现对多台app server的反向代理和负载均衡,但是在并发处理方面apache

自己动手创建一个Web Server(非Socket实现)

目录 介绍 Web Server在Web架构系统中的作用 Web Server与Web网站程序的交互 HTTPListener与Socket两种方式的差异 附带Demo源码概述 Demo效果截图 总结 介绍 本篇文章主要介绍使用HTTPListener类型自己动手创建一个Web Server,创建的Web Server能够接收来自浏览器端的HTTP请求,并且能够传递给对应的Web站点进行处理,最后将处理结果(Html或者其他格式)返回给浏览器. 博主前面曾经介绍过使用Socket模拟Web Se