`
Ydoing
  • 浏览: 105980 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

简单HTTP服务器的Java实现

 
阅读更多

在web的最初阶段是不支持web服务器与用户的交互的.也就是说web服务器不能动态的生成用户要访问的页面,web服务器提供给用户的页面都是提前生成好的.所以也说这种页面是静态页面.
比如说用户请求访问http://localhost:8088/hello1.htm, 那么web服务器从自己的想要目录下获取hello1.htm(已经存在).然后通过HTTP协议返回给用户.

下面我们来模拟一下这个过程.因为HTTP协议是应用层协议,基于TCP,所以我们用Java的socket来编写HTTP服务器.

编写HttpServer

import java.io.*;
import java.net.*;

public class HttpServer {
    private static final int port = 8088;
    private ServerSocket serverSocket = null;

    public HttpServer() throws IOException {
        serverSocket = new ServerSocket(port);
        System.out.println("HTTPServer startup OK...");
    }

    public String getRequest(Socket socket) throws IOException {
        InputStream socketIn = socket.getInputStream();
        int size = socketIn.available();
        byte[] requestBuff = new byte[size];
        socketIn.read(requestBuff);
        return new String(requestBuff);
    }

    public String getURI(String request) {
        String firstLine = request.substring(0, request.indexOf("\r\n"));
        String[] parts = firstLine.split(" ");

        return parts[1];
    }

    public String getContentType(String URI) {
        /* 决定HTTP响应正文的类型 */
        String contentType;
        if (URI.indexOf("html") != -1 || URI.indexOf("htm") != -1)
            contentType = "text/html";
        else if (URI.indexOf("jpg") != -1 || URI.indexOf("jpeg") != -1)
            contentType = "image/jpeg";
        else if (URI.indexOf("gif") != -1)
            contentType = "image/gif";
        else
            contentType = "application/octet-stream";
        return contentType;
    }

    public InputStream getResponseContent(String URI)
            throws FileNotFoundException {
        InputStream htmlInputStream = new FileInputStream(
                System.getProperty("user.dir") + "/WebRoot" + URI);
        return htmlInputStream;
    }

    public String assembleResponseHead(String URI, String contentType) {
        /* 创建HTTP响应结果 */
        // HTTP响应的第一行
        String responseFirstLine = "HTTP/1.1 200 OK\r\n";
        // HTTP响应头
        String responseHeader = "Content-Type:" + contentType + "\r\n\r\n";

        return responseFirstLine + responseHeader;
    }

    public void service() throws InterruptedException {
        while (true) {
            Socket socket;
            try {
                socket = serverSocket.accept();

                String request = getRequest(socket);
                System.out.println("HttpServer receive request:\n" + request);

                String URI = getURI(request);

                String contentType = getContentType(URI);
                OutputStream out = socket.getOutputStream();

                out.write(assembleResponseHead(URI, contentType).getBytes());

                int len = 0;
                byte[] buffer = new byte[128];
                InputStream htmlInputStream = getResponseContent(URI);
                while ((len = htmlInputStream.read(buffer)) != -1)
                    out.write(buffer, 0, len);
                Thread.sleep(1000);
                socket.close(); // 关闭TCP连接
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }

    public static void main(String[] args) throws IOException,
            InterruptedException {
        HttpServer httpServer = new HttpServer();
        // System.out.println(System.getProperty("user.dir"));
        httpServer.service();
    }

}

创建hello1.htm

然后在项目的目录/WebRoot下放置一个hello1.htm页面:
这里写图片描述
hello1.htm很简单,显示标题HelloWorld

<html>
<head>
<title>HelloWorld</title>
</head>
<body >
  <h1>Hello</h1>
</body>
</html>

访问hello1.htm

启动HTTPServer,在浏览器访问http://localhost:8088/hello1.htm,看到eclipse的Console输出

GET /hello1.htm HTTP/1.1
Host: localhost:8088
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.125 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4

这是浏览器请求的HTTP消息,包括了HTTP头,请求方式,有时也有请求正文(这里没有).
浏览器显示为:

这里写图片描述
这样简单的HTTPSever就算完成了,后续我将继续研究模拟一下Servlet的HTTP服务器.

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>

版权声明:本文为博主原创文章,未经博主允许不得转载。

分享到:
评论

相关推荐

    网络编程实验:HTTP服务器 java实现

    然而,这个简单的Java实现为理解基本的HTTP服务器工作原理提供了一个良好的起点。 总结来说,本实验涵盖了Java网络编程的基本概念,特别是使用Socket实现客户端与服务器间的通信,以及对HTTP协议的理解和应用。通过...

    Java实现的Http服务器

    首先,我们关注的是Java语言在实现HTTP服务器中的应用。Java SE(标准版)提供了丰富的API,使得开发人员可以便捷地创建网络应用程序。在这个项目中,`java.net.ServerSocket` 和 `java.net.Socket` 类被用于监听和...

    http简易服务器 java 源码

    【标题】:“http简易服务器 java 源码”是指基于Java...以上就是基于Java实现的HTTP简易服务器的关键知识点和功能解析。理解这些概念有助于你更好地理解和使用这个源码,甚至可以作为学习网络编程和服务器开发的基础。

    java实现http服务器实例

    本实例将带你一步步探索如何利用Java实现一个简单的HTTP服务器,并通过源码解析来深化对HTTP协议的理解。 首先,让我们了解HTTP协议的基础。HTTP(超文本传输协议)是互联网上应用最为广泛的一种网络协议,用于从...

    用java实现的http服务器端例程

    用java实现的http服务器端例程

    用java实现的http服务器端例程java

    总的来说,通过Java实现HTTP服务器是一个很好的学习和实践网络编程技能的机会。这涉及到理解TCP/IP通信、HTTP协议以及Java的I/O操作。通过分析提供的代码和相关资源,开发者可以深入了解网络服务的构建,并为更复杂...

    java实现的http服务器

    Java实现的HTTP服务器是一个基础的网络编程项目,它利用了Java的Socket编程和HTTP协议的知识。这个简单的HTTP服务器能够处理浏览器发起的GET请求,将指定的静态资源(如HTML、CSS、JavaScript文件)发送回客户端,...

    计算机网络实验一 Windows环境下用java实现web服务器

    总的来说,"计算机网络实验一:Windows环境下用Java实现web服务器"是一次综合性的学习体验,涵盖了HTTP协议、网络编程、Java编程以及服务器与前端的交互等多个重要知识点。通过实践,学生将能够更全面地理解Web服务...

    Java实现简单的web文件服务器

    在本文中,我们将深入探讨如何使用Java来实现一个简单的Web文件服务器。这个项目不仅适合Java初学者,也是学习网络编程的绝佳实践。我们将讨论以下几个关键知识点: 1. **TCP与UDP协议**: - TCP(Transmission ...

    JAVA实现简单的http静态网页服务器

    标题 "JAVA实现简单的http静态网页服务器" 涉及的核心知识点是使用Java编程语言构建一个基本的HTTP服务器,用于提供静态网页服务。这通常是为了学习、测试或在简单环境中部署Web应用。以下是对这个主题的详细说明: ...

    JAVA实现的简单的web服务器

    "JAVA实现的简单的web服务器"项目正是这样一个实例,它演示了如何利用Java语言构建一个基本的HTTP服务器,能够处理GET请求并返回HTML页面或图片。在这个过程中,开发者会接触到网络编程、多线程以及HTTP协议等相关...

    JAVA服务器]用Java实现Web

    【Java实现Web服务器详解】 Java是一种广泛用于开发各种应用程序的语言,包括构建Web服务器。要理解如何用Java实现Web服务器,首先要了解Web服务器的工作原理和HTTP协议的基础知识。 **Web服务器的工作原理** Web...

    Java Socket实现简单的web服务器

    Java Socket实现简单的Web服务器是一个基础但实用的编程实践,它涉及到网络编程、HTTP协议和文件I/O等核心概念。在本项目中,我们利用Java的Socket API构建了一个基本的服务器,该服务器仅处理HTTP GET请求并返回...

    java实现简单远程监控

    在IT行业中,远程监控是一项重要的技术,...总的来说,Java实现远程监控是一个涉及JMX、RMI以及网络编程的综合过程。通过合理设计和实现,我们可以构建出一个强大且灵活的监控解决方案,有效管理和维护我们的Java应用。

    java 多线程服务器

    java 实现绘制指针时钟 和多线程服务器java 实现绘制指针时钟 和多线程服务器java 实现绘制指针时钟 和多线程服务器java 实现绘制指针时钟 和多线程服务器java 实现绘制指针时钟 和多线程服务器java 实现绘制指针...

    JAVA实现FTP协议中的服务器和客户端\\

    本文将深入探讨如何使用Java实现FTP协议中的服务器和客户端。通过学习这些知识点,开发者可以构建自己的FTP应用,进行文件的上传、下载和管理。 首先,我们要了解FTP协议的基本工作原理。FTP基于TCP/IP模型,通过...

    java写的http服务器

    1. 使用Java实现HTTP服务器,涉及网络编程、I/O流处理。 2. 理解并处理HTTP协议的不同状态码,如200、304和404。 3. 实现session和cookie管理,理解服务器端和客户端状态的维护方式。 4. 使用MyEclipse进行Java项目...

    简单Web服务器(Java实现)

    支持HTTP1.1(但是不完善),支持多线程(采用的线程池),支持简单CGI(仅PHP的CGI模块通过测试),支持配置文件和简单的日志记录。要支持PHP的动态脚本的话,需要自行下载PHP的文件到php目录下,并且更改设置,...

    Java Socket PC端传输文件简易服务器客户端

    在"Java Socket PC端传输文件简易服务器客户端"这个项目中,我们主要会涉及以下知识点: 1. **Java Socket类**: - Socket类代表了网络上的一个连接,它包含了IP地址和端口号。通过创建Socket实例,客户端可以连接...

    简单JAVA WEB服务器

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

Global site tag (gtag.js) - Google Analytics