Java 实现 web服务器的简单实例

Java 实现 web服务器的简单实例

实例代码:

import java.util.*; 

// Chapter 8, Listing 3
public class WebServerDemo {
  // Directory of HTML pages and other files
  protected String docroot;
  // Port number of web server
  protected int port;
  // Socket for the web server
  protected ServerSocket ss; 

  // Handler for a HTTP request
  class Handler extends Thread {
    protected Socket socket;
    protected PrintWriter pw;
    protected BufferedOutputStream bos;
    protected BufferedReader br;
    protected File docroot; 

    public Handler(Socket _socket, String _docroot) throws Exception {
      socket = _socket;
      // Get the absolute directory of the filepath
      docroot = new File(_docroot).getCanonicalFile();
    } 

    public void run() {
      try {
        // Prepare our readers and writers
        br = new BufferedReader(new InputStreamReader(
            socket.getInputStream()));
        bos = new BufferedOutputStream(socket.getOutputStream());
        pw = new PrintWriter(new OutputStreamWriter(bos)); 

        // Read HTTP request from user (hopefully GET /file...... )
        String line = br.readLine(); 

        // Shutdown any further input
        socket.shutdownInput(); 

        if (line == null) {
          socket.close();
          return;
        }
        if (line.toUpperCase().startsWith("GET")) {
          // Eliminate any trailing ? data, such as for a CGI GET
          // request
          StringTokenizer tokens = new StringTokenizer(line, " ?");
          tokens.nextToken();
          String req = tokens.nextToken(); 

          // If a path character / or / is not present, add it to the
          // document root
          // and then add the file request, to form a full filename
          String name;
          if (req.startsWith("/") || req.startsWith("//"))
            name = this.docroot + req;
          else
            name = this.docroot + File.separator + req; 

          // Get absolute file path
          File file = new File(name).getCanonicalFile(); 

          // Check to see if request doesn't start with our document
          // root ....
          if (!file.getAbsolutePath().startsWith(
              this.docroot.getAbsolutePath())) {
            pw.println("HTTP/1.0 403 Forbidden");
            pw.println();
          }
          // ... if it's missing .....
          else if (!file.exists()) {
            pw.println("HTTP/1.0 404 File Not Found");
            pw.println();
          }
          // ... if it can't be read for security reasons ....
          else if (!file.canRead()) {
            pw.println("HTTP/1.0 403 Forbidden");
            pw.println();
          }
          // ... if its actually a directory, and not a file ....
          else if (file.isDirectory()) {
            sendDir(bos, pw, file, req);
          }
          // ... or if it's really a file
          else {
            sendFile(bos, pw, file.getAbsolutePath());
          }
        }
        // If not a GET request, the server will not support it
        else {
          pw.println("HTTP/1.0 501 Not Implemented");
          pw.println();
        } 

        pw.flush();
        bos.flush();
      } catch (Exception e) {
        e.printStackTrace();
      }
      try {
        socket.close();
      } catch (Exception e) {
        e.printStackTrace();
      }
    } 

    protected void sendFile(BufferedOutputStream bos, PrintWriter pw,
        String filename) throws Exception {
      try {
        java.io.BufferedInputStream bis = new java.io.BufferedInputStream(
            new FileInputStream(filename));
        byte[] data = new byte[10 * 1024];
        int read = bis.read(data); 

        pw.println("HTTP/1.0 200 Okay");
        pw.println();
        pw.flush();
        bos.flush(); 

        while (read != -1) {
          bos.write(data, 0, read);
          read = bis.read(data);
        }
        bos.flush();
      } catch (Exception e) {
        pw.flush();
        bos.flush();
      }
    } 

    protected void sendDir(BufferedOutputStream bos, PrintWriter pw,
        File dir, String req) throws Exception {
      try {
        pw.println("HTTP/1.0 200 Okay");
        pw.println();
        pw.flush(); 

        pw.print("<html><head><title>Directory of ");
        pw.print(req);
        pw.print("</title></head><body><h1>Directory of ");
        pw.print(req);
        pw.println("</h1><table border=/"0/">"); 

        File[] contents = dir.listFiles(); 

        for (int i = 0; i < contents.length; i++) {
          pw.print("<tr>");
          pw.print("<td><a href="/" rel="external nofollow" rel="external nofollow" mce_href="/" rel="external nofollow" rel="external nofollow" "");
          pw.print(req);
          pw.print(contents[i].getName());
          if (contents[i].isDirectory())
            pw.print("/");
          pw.print("/">");
          if (contents[i].isDirectory())
            pw.print("Dir -> ");
          pw.print(contents[i].getName());
          pw.print("</a></td>");
          pw.println("</tr>");
        }
        pw.println("</table></body></html>");
        pw.flush();
      } catch (Exception e) {
        pw.flush();
        bos.flush();
      }
    }
  } 

  // Check that a filepath has been specified and a port number
  protected void parseParams(String[] args) throws Exception {
    switch (args.length) {
    case 1:
    case 0:
      System.err.println("Syntax: <jvm> " + this.getClass().getName()
          + " docroot port");
      System.exit(0); 

    default:
      this.docroot = args[0];
      this.port = Integer.parseInt(args[1]);
      break;
    }
  } 

  public WebServerDemo(String[] args) throws Exception {
    System.out.println("Checking for paramters"); 

    // Check for command line parameters
    parseParams(args); 

    System.out.print("Starting web server...... "); 

    // Create a new server socket
    this.ss = new ServerSocket(this.port); 

    System.out.println("OK"); 

    for (;;) {
      // Accept a new socket connection from our server socket
      Socket accept = ss.accept(); 

      // Start a new handler instance to process the request
      new Handler(accept, docroot).start();
    }
  } 

  // Start an instance of the web server running
  public static void main(String[] args) throws Exception {
    WebServerDemo webServerDemo = new WebServerDemo(args);
  }
} 

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • Java中常见的5种WEB服务器介绍

    Web服务器是运行及发布Web应用的容器,只有将开发的Web项目放置到该容器中,才能使网络中的所有用户通过浏览器进行访问.开发Java Web应用所采用的服务器主要是与JSP/Servlet兼容的Web服务器,比较常用的有Tomcat.Resin.JBoss.WebSphere 和 WebLogic 等,下面将分别进行介绍. Tomcat 服务器 目前最为流行的Tomcat服务器是Apache-Jarkarta开源项目中的一个子项目,是一个小型.轻量级的支持JSP和Servlet 技术的Web服

  • Java实现简易Web服务器

    众所周知Web服务器与客户端之间的通信是使用HTTP协议的.HTTP是一个客户端和服务器端请求和应答的标准(TCP).因为HTTP协议是基于TCP协议的,所以我将使用JAVA中的Socket完成这个简易的Web服务器.关于HTTP更详细的资料,各位可以查阅相关资料进行了解. 在服务器编写之前,我们还是先来看一下浏览器与服务器之间通信的规则到底如何. 首先,我们是用ServerSocket来模拟一个服务端,通过浏览器访问,查看浏览器请求的内容: import java.io.BufferedWri

  • 基于Java web服务器简单实现一个Servlet容器

    上篇写了一个简单的Java web服务器实现,只能处理一些静态资源的请求,本篇文章实现的Servlet容器基于前面的服务器做了个小改造,增加了Servlet请求的处理.  程序执行步骤  1.创建一个ServerSocket对象:  2.调用ServerSocket对象的accept方法,等待连接,连接成功会返回一个Socket对象,否则一直阻塞等待:  3.从Socket对象中获取InputStream和OutputStream字节流,这两个流分别对应request请求和response响应:

  • java 与web服务器链接的实例

    java 与web服务器链接的实例 解决方法 下面的例子演示了如何通过使用net.Socket类sock.getInetAddress()方法获得与Web服务器连接. import java.net.InetAddress; import java.net.Socket; public class WebPing { public static void main(String[] args) { try { InetAddress addr; Socket sock = new Socket(

  • Java Socket编程(五) 简单的WEB服务器

    文章来源:aspcn 作者:孙雯 简单的WEB服务器 一个简单的WEB服务器将由列表9.2这样构建.当然,还必须要对方法和回应事件进行改进.简单的服务器不会分析和存储请求头.新的WEB服务器将分析和存储请求,为以后的处理作准备.为了达到这个目的,你必须有一个包含HTTP请求的类. HTTPrequest类 列表9.5列出了一个完整的HTTPrequest类.这个类必须包括一个请求头所需的所有信息. 列表9.5.HTTPrequest类. import java.io.*; import java

  • AngularJS实现与Java Web服务器交互操作示例【附demo源码下载】

    本文实例讲述了AngularJS实现与Java Web服务器交互操作的方法.分享给大家供大家参考,具体如下: AngularJS是Google工程师研发的产品,它的强大之处不是几句话就能描述的,只有真正使用过的人才能体会到,笔者准备在这篇文章中,以一个简单的登录校验的例子说明如何使用AngularJs和Web服务器进行交互. 准备工作 1.下载angular js库. 官网下载地址:https://angularjs.org/ 或者点击此处本站下载. 2.开发环境准备,由于是和Tomcat服务器

  • 简单实现Java web服务器

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

  • Java 实现 web服务器的简单实例

    Java 实现 web服务器的简单实例 实例代码: import java.util.*; // Chapter 8, Listing 3 public class WebServerDemo { // Directory of HTML pages and other files protected String docroot; // Port number of web server protected int port; // Socket for the web server prot

  • Java 实现随机验证码功能简单实例

    Java 实现随机验证码功能简单实例 现在许多系统的注册.登录或者发布信息模块都添加的随机码功能,就是为了避免自动注册程序或者自动发布程序的使用. 验证码实际上就是随机选择一些字符以图片的形式展现在页面上,如果进行提交操作的同时需要将图片上的字符同时提交,如果提交的字符与服务器session保存的不同,则认为提交信息无效.为了避免自动程序分析解析图片,通常会在图片上随机生成一些干扰线或者将字符进行扭曲,增加自动识别的难度. 在这里,我们使用servlet来实现随机验证码的实现.  实现代码: p

  • java 使用HttpURLConnection发送数据简单实例

    java 使用HttpURLConnection发送数据简单实例 每个 HttpURLConnection 实例都可用于生成单个请求,但是其他实例可以透明地共享连接到 HTTP 服务器的基础网络.请求后在 HttpURLConnection 的 InputStream 或 OutputStream 上调用 close() 方法可以释放与此实例关联的网络资源,但对共享的持久连接没有任何影响.如果在调用 disconnect() 时持久连接空闲,则可能关闭基础套接字.JAVA使用HttpURLCon

  • ASP.NET中Web API的简单实例

    一.Web API的路由 1.在Visual Studio中新建MVC4项目,在App_Start目录下有一个WebApiConfig.cs文件,这个文件中就是相应的Web API的路由配置了. 2.Web API 框架默认是基于 Restful 架构模式的,与ASP.NET MVC 有区别的是,它会根据 Http 请求的 HttpMethod(Get.Post.Put.Delete)来在Controller 中查找 Action,规则是:Action 名中是否以Get.Post 开头?Acti

  • 根据URL下载图片至客户端、服务器的简单实例

    1.保存至服务器 根据路径保存至项目所在服务器上. String imgUrl="";//图片地址 try { // 构造URL URL url = new URL(imgUrl); // 打开连接 URLConnection con = url.openConnection(); // 输入流 InputStream is = con.getInputStream(); // 1K的数据缓冲 byte[] bs = new byte[1024]; // 读取到的数据长度 int le

  • Java IO 之文件读写简单实例

    Java IO 之文件读写简单实例 1.文件读 public class ReadFromFile { /** * 以字节为单位读取文件,常用于读二进制文件,如图片.声音.影像等文件. */ public static void readFileByBytes(String fileName) { File file = new File(fileName); InputStream in = null; try { System.out.println("以字节为单位读取文件内容,一次读一个字

  • JAVA 注解详解及简单实例

    JAVA 注解详解及简单实例 何为注解 注解(Annotation)又称为元数据,在JDK1.5后引入,它的作用是: 生成文档  这是注解的原始用途,可以通过注解生成JavaDoc文档 跟踪代码的依赖性  可以通过注解替代配置文件,简化项目的配置.现有的许多框架都采用这个功能减少自己的配置. 编译检查  在编译时进行格式检查,例如@Override 基础注解 Java目前内置了三种标准注解,以及四种元注解.四种元注解负责创建其他的注解. 三种标准注解 @Override,表示当前的方法覆盖超类中

  • Java持久层框架MyBatis简单实例

    什么是Mybatis MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis .iBATIS一词来源于"internet"和"abatis"的组合,是一个基于Java的持久层框架.iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO). MyBatis 本是apache的一个开源项目iB

  • Java生产1-100的随机数简单实例(分享)

    直接调用Math里面的random即可,简单方便 int i = (int)(Math.random()*100+1); 以上这篇Java生产1-100的随机数简单实例(分享)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

随机推荐