首页 > 编程语言 > 详细

Java实现Http服务器(二)

时间:2015-10-30 18:37:35      阅读:401      评论:0      收藏:0      [点我收藏+]

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

}

  

Java实现Http服务器(二)

原文:http://www.cnblogs.com/wuxinliulei/p/4923969.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!