上节讲到的JDK自带的HttpServer组件,实现方法大概有三十个类构成,下面尝试着理解下实现思路。
由于Java的source代码中有很多注释,粘贴上来看着费劲,自己写个程序消除注释。
import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; /** * @author 作者 E-mail: * @version 创建时间:2015-10-30 下午02:38:17 类说明 处理从JDK当中的注释 */ public class Test { public static void main(String[] args) throws IOException { FileInputStream inputStream = new FileInputStream("source"); FileOutputStream outputStream = new FileOutputStream("res"); BufferedReader br = new BufferedReader(new InputStreamReader(inputStream)); final StringBuilder builder = new StringBuilder(); String tempstr = null; while ((tempstr = br.readLine()) != null) { if (tempstr.indexOf(‘*‘) == -1) { builder.append(tempstr + ‘\n‘); } } outputStream.write(builder.toString().getBytes("gbk")); } }
com.sun.net.httpserver包下的类和接口提供了一系列的标准
sun.net.httpserver包下类根据标准做了一系列的实现
HttpServer.java
package com.sun.net.httpserver; import com.sun.net.httpserver.spi.HttpServerProvider; public abstract class HttpServer { protected HttpServer () { } //默认创建HttpServer对象 public static HttpServer create () throws IOException { return create (null, 0); } //根据InetSocketAddress对象和backlog对象创建HttpServer对象 public static HttpServer create (InetSocketAddress addr, int backlog) throws IOException { //HttpServer实例的服务提供者HttpServerProvider HttpServerProvider provider = HttpServerProvider.provider(); //由服务提供者创建HttpServer对象 return provider.createHttpServer (addr, backlog); } //绑定网络地址接口 public abstract void bind (InetSocketAddress addr, int backlog) throws IOException; //启动httpServer接口 public abstract void start () ; //设置线程池 public abstract void setExecutor (Executor executor); public abstract Executor getExecutor () ; public abstract void stop (int delay); //指定url和相应的处理Handler public abstract HttpContext createContext (String path, HttpHandler handler) ; public abstract HttpContext createContext (String path) ; public abstract void removeContext (String path) throws IllegalArgumentException ; public abstract void removeContext (HttpContext context) ; public abstract InetSocketAddress getAddress() ; }
package com.sun.net.httpserver.spi; import java.io.FileDescriptor; import java.io.IOException; import java.security.AccessController; import java.security.PrivilegedAction; import java.util.Iterator; import sun.misc.Service; import sun.misc.ServiceConfigurationError; import sun.security.action.GetPropertyAction; public abstract class HttpServerProvider { public abstract HttpServer createHttpServer (InetSocketAddress addr, int backlog) throws IOException; public abstract HttpsServer createHttpsServer (InetSocketAddress addr, int backlog) throws IOException; private static final Object lock = new Object(); private static HttpServerProvider provider = null; protected HttpServerProvider() { SecurityManager sm = System.getSecurityManager(); if (sm != null) sm.checkPermission(new RuntimePermission("httpServerProvider")); } private static boolean loadProviderFromProperty() { String cn = System.getProperty("com.sun.net.httpserver.HttpServerProvider"); if (cn == null) return false; try { Class c = Class.forName(cn, true, ClassLoader.getSystemClassLoader()); provider = (HttpServerProvider)c.newInstance(); return true; } catch (ClassNotFoundException x) { throw new ServiceConfigurationError(x); } catch (IllegalAccessException x) { throw new ServiceConfigurationError(x); } catch (InstantiationException x) { throw new ServiceConfigurationError(x); } catch (SecurityException x) { throw new ServiceConfigurationError(x); } } private static boolean loadProviderAsService() { Iterator i = Service.providers(HttpServerProvider.class, ClassLoader.getSystemClassLoader()); for (;;) { try { if (!i.hasNext()) return false; provider = (HttpServerProvider)i.next(); return true; } catch (ServiceConfigurationError sce) { if (sce.getCause() instanceof SecurityException) { // Ignore the security exception, try the next provider continue; } throw sce; } } } public static HttpServerProvider provider () { synchronized (lock) { if (provider != null) return provider; return (HttpServerProvider)AccessController .doPrivileged(new PrivilegedAction<Object>() { public Object run() { if (loadProviderFromProperty()) return provider; if (loadProviderAsService()) return provider; provider = new sun.net.httpserver.DefaultHttpServerProvider(); return provider; } }); } } }
原文:http://www.cnblogs.com/wuxinliulei/p/4923969.html