[JAVA100例]050、一个简单的Web服务器

import java.io.*;
import java.net.*;
/**
* <p>Title: 发现HTTP内容和文件内容</p>
* <p>Description: 获得用户请求后将用户需要的文件读出,添加上HTTP应答头。发送给客户端。</p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Filename: Response.java</p>
* @version 1.0
*/
public class Response{
 OutputStream out = null;
/**
*<br>方法说明:发送信息
*<br>输入参数:String ref 请求的文件名
*<br>返回类型:
*/
 public void Send(String ref) throws IOException {
  byte[] bytes = new byte[2048];
  FileInputStream fis = null;
  try {
    //构造文件
    File file = new File(WebServer.WEBROOT, ref);
    if (file.exists()) {
      //构造输入文件流
      fis = new FileInputStream(file);
      int ch = fis.read(bytes, 0, 2048);
      //读取文件
      String sBody = new String(bytes,0);
      //构造输出信息
      String sendMessage = "HTTP/1.1 200 OK\r\n" +
        "Content-Type: text/html\r\n" +
        "Content-Length: "+ch+"\r\n" +
        "\r\n" +sBody;
      //输出文件
      out.write(sendMessage.getBytes());
    }else {
      // 找不到文件
      String errorMessage = "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>";
      out.write(errorMessage.getBytes());
    }
  
  }
  catch (Exception e) {
    // 如不能实例化File对象,抛出异常。
    System.out.println(e.toString() );
  }
  finally {
    if (fis != null)
      fis.close();
  }
}
/**
*<br>方法说明:构造器,获取输出流
*<br>输入参数:
*<br>返回类型:
*/
public Response(OutputStream output) {
  this.out = output;
}
}
import java.io.*;
import java.net.*;
/**
* <p>Title: 客户请求分析</p>
* <p>Description: 获取客户的HTTP请求,分析客户所需要的文件</p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Filename: Request.java</p>
* @version 1.0
*/
public class Request{
 InputStream in = null;
/**
*<br>方法说明:构造器,获得输入流。这时客户的请求数据。
*<br>输入参数:
*<br>返回类型:
*/
 public Request(InputStream input){
  this.in = input;
 }
/**
*<br>方法说明:解析客户的请求
*<br>输入参数:
*<br>返回类型:String 请求文件字符
*/
 public String parse() {
  //从Socket读取一组数据
  StringBuffer requestStr = new StringBuffer(2048);
  int i;
  byte[] buffer = new byte[2048];
  try {
    i = in.read(buffer);
  }
  catch (IOException e) {
    e.printStackTrace();
    i = -1;
  }
  for (int j=0; j<i; j++) {
    requestStr.append((char) buffer[j]);
  }
  System.out.print(requestStr.toString());
  return getUri(requestStr.toString());
 }
/**
*<br>方法说明:获取URI字符
*<br>输入参数:String requestString 请求字符
*<br>返回类型:String URI信息字符
*/
 private String getUri(String requestString) {
  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;
 }
}
import java.io.*;
import java.net.*;
import java.util.*;
/**
* <p>Title: WEB服务器</p>
* <p>Description: 使用Socket创建一个WEB服务器,本程序是多线程系统以提高反应速度。</p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Filename: WebServer.java</p>
* @version 1.0
*/
class WebServer
{
public static String WEBROOT = "";//默认目录
public static String defaultPage = "index.htm";//默认文件
public static void main (String [] args) throws IOException
{//使用输入的方式通知服务默认目录位置,可用./root表示。
  if(args.length!=1){
   System.out.println("USE: java WebServer ./rootdir");
   return;
  }else{
   WEBROOT = args[0];
  }
  System.out.println ("Server starting...\n");
  //使用8000端口提供服务
  ServerSocket server = new ServerSocket (8000);
  while (true)
  {
  //阻塞,直到有客户连接
   Socket sk = server.accept ();
   System.out.println ("Accepting Connection...\n");
   //启动服务线程
   new WebThread (sk).start ();
  }
}
}
/**
* <p>Title: 服务子线程</p>
* <p>Description: 使用线程,为多个客户端服务</p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Filename: </p>
* @author 杜江
* @version 1.0
*/
class WebThread extends Thread
{
private Socket sk;
WebThread (Socket sk)
{
 this.sk = sk;
}
/**
*<br>方法说明:线程体
*<br>输入参数:
*<br>返回类型:
*/
public void run ()
{
 InputStream in = null;
 OutputStream out = null;
 try{
  in = sk.getInputStream();
  out = sk.getOutputStream();
   //接收来自客户端的请求。
   Request rq = new Request(in);
   //解析客户请求
   String sURL = rq.parse();
   System.out.println("sURL="+sURL);
   if(sURL.equals("/")) sURL = WebServer.defaultPage;
   Response rp = new Response(out);
   rp.Send(sURL);
  }catch (IOException e)
  {
    System.out.println (e.toString ());
  }
  finally
  {
   System.out.println ("Closing Connection...\n");
   //最后释放资源
   try{
    if (in != null)
     in.close ();
    if (out != null)
     out.close ();
    if (sk != null)
     sk.close ();
   }
   catch (IOException e)
   {
   }
  }
}
}

时间: 2024-09-07 10:43:14

[JAVA100例]050、一个简单的Web服务器的相关文章

一个简单的web服务器

写在前面 新的一年了,新的开始,打算重新看一遍asp.net本质论这本书,再重新认识一下,查漏补缺,认认真真的过一遍. 一个简单的web服务器 首先需要引入命名空间: System.Net,关于网络编程的大部分类型及操作都可以在这个命名空间下找到. IPAddress:类用来表示一个ip地址. IPEndPoint:用来表示一个IP地址和一个端口号的组合,称为网络的端点. System.Net.Sockets:命名空间中提供了基于Socket编程的数据类型. Socket类封装了Socket的操

《深入剖析Tomcat》一第 1 章 一个简单的Web服务器

第 1 章 一个简单的Web服务器 本章介绍Java Web服务器是如何运行的.Web服务器也称为超文本传输协议(HyperText Transfer Protocol,HTTP)服务器,因为它使用HTTP与其客户端(通常是Web浏览器)进行通信.基于Java的Web服务器会使用两个重要的类:java.net.Socket类和java.net.ServerSocket类,并通过发送HTTP消息进行通信.本章先介绍HTTP协议和这两个类,然后介绍一个简单的Web服务器.

如何用node.js实现一个简单的web服务器

node.js实现web服务器还是比较简单的,我了解node.js是从<node入门>开始的,如果你不了解node.js也可以看看! 我根据那书一步一步的练习完了,也的确大概了解了node.js,不过里面写的路由的地方总感觉不方便,十一放假最后一天,试着写了个简单的web服务器,现在分享记录于此! http模块已提供了基本功能,所以我主要解决两个问题,1是静态资源的处理,2是动态资源的路由. 静态资源在node.js里的意思是不变的,如图片.前端js.css.html页面等. 动态资源我们一般

创建一个简单的web服务器

Web服务器也称为超文本传输协议(HTTP)服务器,因为它使用HTTP来跟客户端进行通信的.既然说到通信那就离不了Java里的两个重要的类java.net.Socket和java.net.ServerSocket.这里浏览器一方可以认为是一个客户端,接收HTTP请求的一方可以认为是服务端.在这之前我们先说一下HTTP协议. HTTP协议允许web服务器和浏览器通过网络来进行发送和接收数据.它是一种请求和响应协议.客户端发送一个请求,服务端响应这个请求.HTTP请求由三部分组成,分别是:请求行.消

go 语言实现一个简单的 web 服务器

学习Go语言的一些感受,不一定准确. 假如发生战争,JAVA一般都是充当航母战斗群的角色.一旦出动,就是护卫舰.巡洋舰.航母舰载机.预警机.电子战飞机.潜艇等等浩浩荡荡,杀将过去.(JVM,数十个JAR包,Tomcat中间件,SSH框架,各种配置文件...天生就是重量级的,专为大规模作战) 而GO语言更像F35战斗轰炸机单枪匹马,悄无声息,投下炸弹然后走人.专属轰炸机,空战也会一点点.实在搞不定,就叫它大哥F22.(GO是编译型语言,不需要依赖,不需要虚拟机,可以调用C代码并且它足够简单,却非常

创建一个简单的web服务器(二):使用自定义的类加载器来替换URLClassLoader

在上一章中我们加载Servlet用的是URLClassLoader,在这一章中我们使用自定义的类加载器来替换URLClassLoader.关于类加载器的文章请参考这里:深入探讨 Java 类加载器.这篇文章写得很棒. 具体的代码如下: package com.zkn.imitate.tomcat.secondchapter.first; import com.zkn.imitate.tomcat.secondchapter.Request; import com.zkn.imitate.tomc

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

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

深入剖析tomcat之一个简单的web服务器

这个简单的web服务器包含三个类 HttpServer Request Response 在应用程序的入口点,也就是静态main函数中,创建一个HttpServer实例,然后调用其await()方法.顾名思义,await方法会在制定的端口上等待http请求,并对其进行处理,然后发送相应的消息回客户端.在接收到命令之前,它会一直保持等待的状态. HttpServer类 package simpleHttpServer; import java.io.File; import java.io.IOE

使用 CodeIgniter 创建一个简单的 Web 站点

原文:使用 CodeIgniter 创建一个简单的 Web 站点   参考源自: http://www.ibm.com/developerworks/cn/web/wa-codeigniter/index.html 我的第一个 CodeIgniter 项目(除HelloWorld外),现整理记录下来.   相关环境: 系统:ubuntu-10.04.3 Apache:httpd-2.4.7 PHP:php-5.4.22 MySQL:mysql-5.6.16 CI:CodeIgniter-2.2.