`
IXHONG
  • 浏览: 450387 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

一个简单的Web服务器

阅读更多

 

HttpServer, Request, Response

package com.iteye.wely.server;

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;

/**
 * Created by shenhongxi on 16/3/21.
 */
public class HttpServer {

    public static final String WEB_ROOT = System.getProperty("user.dir") + File.separator + "ixhong-tomcat-web/src/main/webapp";

    private static final String SHUTDOWN_COMMAND = "SHUTDOWN";

    private boolean shutdown = false;

    public static void main(String[] args) {
        HttpServer server = new HttpServer();
        System.out.println(WEB_ROOT);
        server.await();
    }

    private void await() {
        ServerSocket serverSocket = null;
        int port = 8080;
        try {
            serverSocket = new ServerSocket(port, 1, InetAddress.getByName("127.0.0.1"));
            System.out.println("Server started!");
        } 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;
            }
        }
    }
}
package com.iteye.wely.server;

import java.io.IOException;
import java.io.InputStream;

/**
 * Created by shenhongxi on 16/3/21.
 */
public class Request {

    private InputStream input;

    private String uri; // 性能考虑,用byte[]

    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.println(request.toString());
        uri = parseUri(request.toString());
    }

    private String parseUri(String requestStr) {
        // GET /index.html HTTP/1.1
        // Accept: text/plain; text/html
        // ...
        int index1 = requestStr.indexOf(' ');
        int index2;
        if (index1 != -1) {
            index2 = requestStr.indexOf(' ', index1 + 1);
            if (index2 > index1) {
                return requestStr.substring(index1 + 1, index2);
            }
        }
        return null;
    }

    public String getUri() {
        return uri;
    }
}
package com.iteye.wely.server;

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

/**
 * Created by shenhongxi on 16/3/21.
 */
public class Response {

    private static final int BUFFER_SIZE = 1024;

    Request request;

    OutputStream output;

    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 errorMsg = "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(errorMsg.getBytes());
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fis != null) {
                fis.close();
            }
        }
    }

    public Response(OutputStream output) {
        this.output = output;
    }

    public void setRequest(Request request) {
        this.request = request;
    }
}

 

0
1
分享到:
评论

相关推荐

    简单Web服务器设计与实现.doc

    "简单Web服务器设计与实现" 本文主要介绍了简单Web服务器的设计与实现,涵盖了WWW的工作原理、HTTP协议、Java语言、Web服务器的设计与实现等方面的知识点。 WWW的工作原理基于客户机/服务器计算模型,由Web浏览器...

    C#编写的简单web服务器(含源代码)

    在本资源中,我们主要探讨的是使用C#编程语言实现的一个简单Web服务器。这个Web服务器是初学者了解网络编程和HTTP协议的绝佳实践项目。通过分析和运行提供的源代码,你可以深入理解Web服务器的工作原理,并学习如何...

    简单搭建WEB服务器 简单搭建WEB服务器 简单搭建WEB服务器

    本文将详细介绍如何简单搭建一个WEB服务器,包括基础概念、所需工具及步骤,旨在帮助初学者快速入门。 一、Web服务器的基础概念 1. HTTP:HTTP是互联网上应用最为广泛的一种网络协议,用于从万维网服务器传输超文本...

    Python项目源码7_简单的Web服务器.rar

    这个压缩包"Python项目源码7_简单的Web服务器.rar"显然包含了使用Python编写的一个简单Web服务器的源代码。让我们深入探讨一下这个主题。 首先,我们要理解Web服务器的基本概念。Web服务器是一种软件,它接收HTTP...

    多线程web服务器

    本项目是用C++实现的一个简单Web服务器,它能够处理GET请求,是学习多线程技术和网络编程的典型实例。 首先,让我们详细探讨“多线程”这一概念。在计算机程序设计中,多线程允许一个应用程序同时执行多个不同的...

    一个简单的web服务器编程实例

    本实例将带你走进Web服务器编程的世界,通过一个简单的实例来理解其工作原理。 首先,我们要了解Web服务器的基本概念。Web服务器主要任务是接收来自客户端(如浏览器)的HTTP请求,解析请求中的信息,如URL、HTTP...

    守望简单web服务器

    总的来说,【守望简单Web服务器】为个人和小团队提供了一个快速上手的Web服务解决方案,方便进行网站开发和测试。用户在使用过程中应遵循安全最佳实践,并结合其他资源进行学习,提升自己的Web技术能力。

    简单的web服务器

    这个“简单的web服务器”项目旨在通过Java实现一个基础版的Web服务器,类似于流行的Tomcat服务器,它能够处理静态资源的请求。 【描述】:此项目的核心目标是提供一个基础的环境,使开发者能够快速地测试和部署静态...

    c#简单web服务器开发实例

    总的来说,通过学习和实践这个C#简单Web服务器开发实例,你可以了解到如何利用`HttpListener`构建基本的Web服务,这将有助于理解HTTP协议、网络编程以及.NET Framework的网络功能。随着对Web服务器原理和`...

    C#编写的简单web服务器

    在这个场景中,我们关注的是一个使用C#编程语言实现的简单Web服务器。C#是Microsoft开发的一种面向对象的编程语言,广泛应用于Windows平台上的应用程序开发,包括Web服务。 1. **C#与Web服务器**: C#提供了丰富的...

    简单JAVA WEB服务器

    本项目“简单JAVA WEB服务器”旨在提供一个基础的平台,帮助学习者理解Java Web服务器的工作原理,特别是静态网页服务和JSP(Java Server Pages)的执行,以及Cookie的解析。 1. **多线程技术**:Java Web服务器...

    一个简单的web服务器案例

    一个用java实现的简单web服务器的程序,用eclipse开发的

    超级简单的web服务器

    本篇文章将深入探讨一个被称为"超级简单的Web服务器"的概念,特别是针对那些希望快速分享本地文件而无需复杂配置的用户。 "超级简单的Web服务器"通常指的是那些轻量级、易于使用且快速部署的Web服务解决方案。它们...

    简单web服务器实现

    下面是一个简单的基于 Java 的 Web 服务器示例代码片段,用于接收 GET 请求并返回一个简单的 HTML 页面: ```java import java.io.*; import java.net.*; public class SimpleWebServer { public static void ...

    易语言简易WEB服务器源码.rar

    【标题】"易语言简易WEB服务器源码.rar" 指的是一款基于易语言开发的简单Web服务器的源代码资源。易语言是中国本土设计的一种编程语言,它以其独特的汉字编程方式,降低了编程的门槛,使得非计算机专业人员也能快速...

    一个支持servlet的web服务器.rar

    这个压缩包“一个支持servlet的web服务器.rar”很可能包含了实现这一功能的源代码、配置文件或者是一个预编译好的服务器软件,允许开发者在本地环境中运行和测试Servlet应用。下面我们将深入探讨Servlet以及如何在...

    WEB服务器、应用程序服务器、HTTP服务器区别

    IIS、Apache、Tomcat、Weblogic、WebSphere 都是不同的服务器, Apache 是纯粹的 Web 服务器,Tomcat 是一个 Servlet 和 JSP 容器,可以作为轻量级应用服务器,IIS 是一个兼具应用服务器功能的 Web 服务器,Weblogic...

    Linux- 用C语言实现的简单Web服务器源代码

    总的来说,"Linux- 用C语言实现的简单Web服务器源代码"为学习者提供了一个宝贵的实践平台,帮助他们从零开始理解Web服务器的运作方式。通过分析和修改源代码,不仅可以提高C语言编程技能,还能增强对网络协议和...

    C#简单的web服务器

    6. **ASP.NET Core**:虽然题目描述的是一个简单的C# Web服务器,但现代的C#开发往往使用ASP.NET Core框架,它提供了一套完整的Web开发工具和库,可以更高效地构建高性能的Web应用。不过,基础的Web服务器实现可以...

Global site tag (gtag.js) - Google Analytics