zoukankan      html  css  js  c++  java
  • http服务器

    什么是HTTP服务器?要理解这个概念,我们先要知道HTTP协议。HTTP协议(HypertextTransferProtocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。这就是你为什么在浏览器中看到的网页地址都是以“http://”开头的原因。

     

    由于HTTP协议是基于请求/响应范式的(相当于客户端/服务器)。一个客户端与服务器建立连接后,发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。

     

    WWW中,客户端服务器是一个相对的概念,只存在于一个特定的连接期间,即在某个连接中的客户在另一个连接中可能作为服务器。基于HTTP协议的客户/服务器模式的信息交换过程,它分四个过程:建立连接、发送请求信息、发送响应信息、关闭连接。

     

    现在我们就来做一个简易的http服务器程序,更深刻地理解它们的工作方式。这里我们做两个类HttpServer.javaHttpSession.java,同时我们将所有的web资源放在E://www目录下:

     

    HttpServer.java

    package com.wepull.http;

     

    import java.io.IOException;

    import java.net.ServerSocket;

    import java.net.Socket;

     

    public class HttpServer {

     

       public void startServer() {

          ServerSocket ss = null;

          try {

            ss = new ServerSocket(80);

            while (true) {

               Socket s = ss.accept();

               new HttpSession(s).start();

            }

          } catch (IOException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

          } finally {

            try {

               ss.close();

            } catch (IOException e) {

               // TODO Auto-generated catch block

               e.printStackTrace();

            }

          }

       }

     

       public static void main(String[] args) {

          HttpServer server = new HttpServer();

          server.startServer();

       }

    }

     

     

    HttpSession.java

    package com.wepull.http;

     

    import java.io.*;

    import java.net.Socket;

    import java.text.DateFormat;

    import java.util.Date;

     

    public class HttpSession extends Thread {

       public static final String PATH_NAME = "E://www//";

       private Socket s;

     

       public HttpSession(Socket s) {

          super();

          this.s = s;

       }

     

       @Override

       public void run() {

          BufferedReader br = null;

          OutputStream out = null;

          try {

            br = new BufferedReader(new InputStreamReader(s.getInputStream()));

            out = s.getOutputStream();

            String line = "";

            while ((line = br.readLine()) != null) {

               if (line.equals("")) {

                  break;

               }

               System.out.println(line);

               String[] cmds = line.split(" ");

               // 处理客户端更重要的指令

               if (cmds[0].equals("GET")) {

                  String fileName = cmds[1].substring(1);

                  if (fileName.equals("")) {

                     fileName = "index.htm";

                  }

                  doGet(out, PATH_NAME + fileName);

               }

     

            }

     

          } catch (IOException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

          } finally {

            try {

               br.close();

               out.close();

               s.close();

            } catch (IOException e) {

               // TODO Auto-generated catch block

               e.printStackTrace();

            }

          }

       }

     

       private void printOkResponse(OutputStream out, File file) {

          PrintWriter pw = new PrintWriter(out);

          pw.println("HTTP/1.1 200 OK");

          pw.println("Server: Apache-Coyote/1.1");

          pw.println("ETag: W//"6381-1144994988000/"");

          pw.println("Last-Modified: Fri, 14 Apr 2006 06:09:48 GMT");

          pw.println("Content-Type: text/plain");

          pw.println("Content-Length: " + file.length());

     

          DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL,

               DateFormat.FULL);

          pw.println(df.format(new Date()));

     

          pw.println("Connection: keep-alive");

     

          pw.println("");

          pw.flush();

       }

     

       private void doGet(OutputStream out, String fileName) {

          printOkResponse(out, new File(fileName));

          FileInputStream fis;

          try {

            fis = new FileInputStream(fileName);

            byte[] buf = new byte[1024];

            int len = 0;

            while ((len = fis.read(buf)) != -1) {

               out.write(buf, 0, len);

            }

            fis.close();

          } catch (FileNotFoundException e) {

            e.printStackTrace();

          } catch (IOException e) {

            e.printStackTrace();

          }

     

       }

     

    }

     

    完成后,启动我们的服务器程序,客户端浏览器就可以通过我们的IP80端口访问到我们提供的服务,获取他们想要的web资源啦。

  • 相关阅读:
    06 | x86架构:有了开放的架构,才能打造开放的营商环境
    02 | 学习路径:爬过这六个陡坡,你就能对Linux了如指掌
    01 | 入学测验:你究竟对Linux操作系统了解多少?
    String、StringBuffer与StringBuilder区别
    JavaSE语言基础之字符串
    JavaSE语言基础之数组及其排序
    JavaSE语言基础之流程控制语句
    JavaSE语言基础之数据类型
    Java开发环境配置
    shell 脚本 自增
  • 原文地址:https://www.cnblogs.com/CharmingDang/p/9663831.html
Copyright © 2011-2022 走看看