上节讲到的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