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

用JAVA实现的简单web服务器

    博客分类:
  • Java
阅读更多
  1. /**  
  2.  * 用Java语言实现HTTP服务器,首先启动一个java.net.ServerSocket在提供服务的端口上监听连接.向客户返回文本时,可以用  
  3.  * PrintWriter,但是如果返回二进制数据,则必须使用OutputStream.write(byte[])方法,返回的应答消息字符串可以使用  
  4.  * String.getBytes()方法转换为字节数组返回,或者使用PrintStream的print()方法写入文本,用  
  5.  * write(byte[])方法写入二进制数据.  
  6.  *   
  7.  * 以工程所在目录为web的根目录。 在工程的根目录下放一个大概如下的index.html  
  8.  *   
  9.  * <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  
  10.  * "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta  
  11.  * http-equiv="Content-Type" content="text/html; charset=gbk">  
  12.  * <title>简单的测试</title> </head> <body> 你好!这是一个 简单的web服务器。<br>  
  13.  * 这是一个图片!<br>  
  14.  *   
  15.  * <form action="/index.html"> <img alt="" src="images/test.gif"><br>  
  16.  * 姓名:<input type="text" name="name" /><br>  
  17.  * 密码:<input type="password" name="pass"></input><br>  
  18.  * <input type="submit"/> </form> </body> </html>  
  19.  *   
  20.  * 放入图片位置: 工程根目录/images/test.gif <br>  
  21.  * 打开浏览器输入http://localhost/index.html 可以展示index.html  
  22.  *   
  23.  * @author guazi  
  24.  */  
  25. public class SimpleHttpServer implements Runnable {   
  26.        
  27.     ServerSocket serverSocket;// 服务器Socket   
  28.   
  29.        
  30.     /**  
  31.      * 服务器监听端口, 默认为 80.  
  32.      */  
  33.     public static int PORT = 80;// 标准HTTP端口   
  34.   
  35.     /**  
  36.      * 开始服务器 Socket 线程.  
  37.      */  
  38.     public SimpleHttpServer() {   
  39.         try {   
  40.             serverSocket = new ServerSocket(PORT);   
  41.         } catch (Exception e) {   
  42.             System.out.println("无法启动HTTP服务器:" + e.getMessage());   
  43.         }   
  44.         if (serverSocket == null)   
  45.             System.exit(1);// 无法开始服务器   
  46.   
  47.         new Thread(this).start();   
  48.         System.out.println("HTTP服务器正在运行,端口:" + PORT);   
  49.     }   
  50.   
  51.        
  52.     /**  
  53.      * 运行服务器主线程, 监听客户端请求并返回响应.  
  54.      */  
  55.     public void run() {   
  56.         while (true) {   
  57.             try {   
  58.                 Socket client = null;// 客户Socket   
  59.                 client = serverSocket.accept();// 客户机(这里是 IE 等浏览器)已经连接到当前服务器   
  60.                 if (client != null) {   
  61.                     System.out.println("连接到服务器的用户:" + client);   
  62.                     try {   
  63.                         // 第一阶段: 打开输入流   
  64.                         BufferedReader in = new BufferedReader(   
  65.                                 new InputStreamReader(client.getInputStream()));   
  66.   
  67.                         System.out.println("客户端发送的请求信息: ***************");   
  68.                         // 读取第一行, 请求地址   
  69.                         System.out.println("http协议头部信息:");   
  70.                         String line = in.readLine();   
  71.                         System.out.println(line);   
  72.                         String resource = line.substring(line.indexOf('/'),   
  73.                                 line.lastIndexOf('/') - 5);   
  74.                         // 获得请求的资源的地址   
  75.                         resource = URLDecoder.decode(resource, "gbk");// 反编码   
  76.   
  77.                         String method = new StringTokenizer(line).nextElement()   
  78.                                 .toString();// 获取请求方法, GET 或者 POST   
  79.   
  80.                         // 读取浏览器发送过来的请求参数头部信息   
  81.                         while ((line = in.readLine()) != null) {   
  82.                             System.out.println(line);   
  83.   
  84.                             if (line.equals(""))   
  85.                                 break;   
  86.                         }   
  87.   
  88.                         System.out.println("http协议头部结束 ***************");   
  89.                         System.out.println("用户请求的资源是:" + resource);   
  90.                         System.out.println("请求的类型是: " + method);   
  91.   
  92.                         String params = null;   
  93.   
  94.                         if (resource.indexOf("?") > -1) {   
  95.                             params = resource   
  96.                                     .substring(resource.indexOf("?") + 1);   
  97.                             resource = resource.substring(0, resource   
  98.                                     .indexOf("?"));   
  99.                         }   
  100.   
  101.                         // 显示 POST 表单提交的内容, 这个内容位于请求的主体部分   
  102.                         if ("POST".equalsIgnoreCase(method)) {   
  103.                             if (params != null) {   
  104.                                 params +="&" + in.readLine();   
  105.                             }else{   
  106.                                     params =in.readLine();   
  107.                             }   
  108.                         }   
  109.   
  110.                         System.out.println("打印提交的数据:");   
  111.                         printParams(params);   
  112.   
  113.                         // 读取资源并返回给客户端   
  114.                         fileReaderAndReturn(resource, client);   
  115.                         // 关闭客户端链接   
  116.                         client.close();   
  117.                         System.out.println("客户端返回完成!");   
  118.                     } catch (Exception e) {   
  119.                         System.out.println("HTTP服务器错误:" + e.getMessage());   
  120.                     }   
  121.                 }   
  122.   
  123.             } catch (Exception e) {   
  124.                 System.out.println("HTTP服务器错误:" + e.getMessage());   
  125.             }   
  126.         }   
  127.     }   
  128.   
  129.     /**  
  130.      * 读取一个文件的内容并返回给浏览器端.  
  131.      *   
  132.      * @param fileName  
  133.      *            文件名  
  134.      * @param socket  
  135.      *            客户端 socket.  
  136.      * @throws IOException  
  137.      */  
  138.     void fileReaderAndReturn(String fileName, Socket socket) throws IOException {   
  139.         if ("/".equals(fileName)) {// 设置欢迎页面,呵呵!   
  140.             fileName = "/index.html";   
  141.         }   
  142.         fileName = fileName.substring(1);   
  143.   
  144.         PrintStream out = new PrintStream(socket.getOutputStream(), true);   
  145.         File fileToSend = new File(fileName);   
  146.   
  147.         String fileEx = fileName.substring(fileName.indexOf(".") + 1);   
  148.         String contentType = null;   
  149.         // 设置返回的内容类型   
  150.         // 此处的类型与tomcat/conf/web.xml中配置的mime-mapping类型是一致的。测试之用,就写这么几个。   
  151.         if ("htmlhtmxml".indexOf(fileEx) > -1) {   
  152.             contentType = "text/html;charset=GBK";   
  153.         } else if ("jpegjpggifbpmpng".indexOf(fileEx) > -1) {   
  154.             contentType = "application/binary";   
  155.         }   
  156.   
  157.         if (fileToSend.exists() && !fileToSend.isDirectory()) {   
  158.             // http 协议返回头   
  159.             out.println("HTTP/1.0 200 OK");// 返回应答消息,并结束应答   
  160.             out.println("Content-Type:" + contentType);   
  161.             out.println("Content-Length:" + fileToSend.length());// 返回内容字节数   
  162.             out.println();// 根据 HTTP 协议, 空行将结束头信息   
  163.   
  164.             FileInputStream fis = null;   
  165.             try {   
  166.                 fis = new FileInputStream(fileToSend);   
  167.             } catch (FileNotFoundException e) {   
  168.                 out.println("<h1>404错误!</h1>" + e.getMessage());   
  169.             }   
  170.             byte data[];   
  171.             try {   
  172.                 data = new byte[fis.available()];   
  173.   
  174.                 fis.read(data);   
  175.                 out.write(data);   
  176.             } catch (IOException e) {   
  177.                 out.println("<h1>500错误!</h1>" + e.getMessage());   
  178.                 e.printStackTrace();   
  179.             } finally {   
  180.                 out.close();   
  181.                 try {   
  182.                     fis.close();   
  183.                 } catch (IOException e) {   
  184.   
  185.                     e.printStackTrace();   
  186.                 }   
  187.             }   
  188.         } else {   
  189.             out.println("<h1>404错误!</h1>" + "文件没有找到");   
  190.             out.close();   
  191.   
  192.         }   
  193.   
  194.     }   
  195.   
  196.     void printParams(String params) throws IOException {   
  197.         if (params == null) {   
  198.             return;   
  199.         }   
  200.         String[] maps = params.split("&");   
  201.         for (String temp : maps) {   
  202.             String[] map = temp.split("=");   
  203.             System.out.println(map[0] + "==" + map[1]);   
  204.         }   
  205.     }   
  206.   
  207.     /** */  
  208.     /**  
  209.      * 启动 HTTP 服务器  
  210.      *   
  211.      * @param args  
  212.      */  
  213.     public static void main(String[] args) {   
  214.         try {   
  215.             if (args.length != 1) {   
  216.                 System.out.println("这是一个简单的web服务器 ,端口是: 80.");   
  217.             } else if (args.length == 1) {   
  218.                 PORT = Integer.parseInt(args[0]);   
  219.             }   
  220.         } catch (Exception ex) {   
  221.             System.err.println("服务器初始化错误" + ex.getMessage());   
  222.         }   
  223.   
  224.         new SimpleHttpServer();   
  225.     }  
分享到:
评论

相关推荐

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

    在本实验中,我们将探索如何在Windows环境下使用Java语言实现一个基本的Web服务器。这个实践项目旨在深化学生对HTTP协议的理解,以及Web服务器的工作机制。HTTP(超文本传输协议)是互联网上应用最为广泛的一种网络...

    java 实现简单web服务器

    用java语言实现了最简单的web服务器,供大家参考!

    用java实现Web服务器

    ### 使用Java实现Web服务器的关键知识点 #### 一、HTTP协议的作用原理 HTTP协议(HyperText Transfer Protocol)是一种应用层协议,用于从Web服务器传输超文本到本地浏览器的传输协议。它使得分布式、协作式和超...

    用Java实现Web服务器

    总的来说,"用Java实现Web服务器"是一个锻炼基础网络编程和多线程技能的好项目。它可以帮助开发者深入理解网络通信过程,提升Java编程能力,同时为理解和开发更复杂的Web应用打下坚实基础。虽然目前的实现存在局限性...

    JAVA服务器]用Java实现Web

    要理解如何用Java实现Web服务器,首先要了解Web服务器的工作原理和HTTP协议的基础知识。 **Web服务器的工作原理** Web服务器的核心职责是处理来自Web浏览器的HTTP请求,并返回相应的HTTP响应。这个过程基于客户机/...

    Java实现简易Web服务器

    在本文中,我们将探讨如何使用Java实现一个简单的Web服务器。首先,我们要理解Web服务器的基本工作原理,它主要是基于HTTP(超文本传输协议)与客户端(通常是浏览器)进行通信。HTTP是一种应用层协议,建立在TCP/IP...

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

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

    JAVA版简易web服务器

    学习计算机网络http协议时写的 JAVA版简易web服务器 JAVA版简易web服务器 JAVA版简易web服务器 JAVA版简易web服务器 JAVA版简易web服务器 JAVA版简易web服务器 JAVA版简易web服务器

    简单JAVA WEB服务器

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

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

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

    简单Web服务器(Java实现)

    这是《计算机网络》的课程设计--多线程的Web服务器(带有课程设计报告),里面为Eclipse3.5的工程。支持HTTP1.1(但是不完善),支持多线程(采用的线程池),支持简单CGI(仅PHP的CGI模块通过测试),支持配置文件...

    纯java写的web服务器

    然而,一个“纯Java写的web服务器”可能不依赖这些成熟的容器,而是直接实现Servlet的逻辑,或者使用其他方式(如函数式编程、微服务框架)来处理动态请求。 在提供的压缩包文件"myserver"中,可能包含了服务器的源...

    JAVA实现的简单的web服务器

    在IT领域,特别是Java编程实践中,开发一个简单的Web服务器是一项基础且重要的技能。"JAVA实现的简单的web服务器"项目正是这样一个实例,它演示了如何利用Java语言构建一个基本的HTTP服务器,能够处理GET请求并返回...

    用java编写的web服务器

    知识点:使用Java编程语言构建Web服务器 在现代网络开发中,使用高级编程语言如Java来构建Web服务器变得越来越常见。这种做法不仅提升了开发效率,还增强了服务器的安全性和可扩展性。下面,我们将深入探讨如何使用...

    WINDOW环境下用JAVA实现WEB服务器_MultiWebServer.java

    WINDOW环境下用JAVA实现WEB服务器_MultiWebServer.java (1)处理一个http请求 (2)接收并解析http请求 (3)从服务器文件系统中获得被请求的文件 (4)创建一个包括被请求的文件的http响应信息 直接发送该信息到...

    Java开发的简单WEB服务器源码Java实用源码整理learns

    这个项目可能包含了一个简单的HTTP服务器实现,允许用户理解Web服务器的工作原理以及如何用Java进行网络编程。下面将详细解释与这个主题相关的Java Web开发知识。 1. **Java Web基础**: - **Servlet**:Java Web...

    Java开发的简单WEB服务器源码

    本项目标题为“Java开发的简单WEB服务器源码”,意味着它提供了一个用Java语言编写的Web服务器的源代码,我们可以从中学习到如何构建一个能响应HTTP请求并返回静态资源的服务器。 首先,我们要了解Web服务器的基本...

    最简单的web服务器的代码java.doc

    本文档的标题是“最简单的 Web 服务器的代码 Java”,这表明本文档是一个关于使用 Java语言实现简单 Web 服务器的教程。 描述解析 本文档的描述是“最简单的 Web 服务器的代码 Java”,这进一步强调了本文档的主题...

    java web 服务器 源码

    8. **src 目录**: 存放原始的Java源代码,开发者可以在这里查看Web服务器的实现细节。 9. **webapps 目录**: 标准的Tomcat或者任何Java Web服务器的结构中,webapps目录是用来存放Web应用程序的。每个子目录代表一...

Global site tag (gtag.js) - Google Analytics