当前位置:编程学习 > JAVA >>

Java处理http协议相关初步(二)——httpserver

这里的HttpServer,并不是哪里专门下载的类库了,而是在JDK1.6中自带的,在com.sun.net.httpserver包中,提供了简单的较高层次意义上的Http ServerAPI,可以构建内置的HTTP Server,支持Http和Https协议,提供了HTTP1.1的部分实现,没有被实现的那部分可以通过扩展已有的Http Server API来实现。程序员必须自己实现HttpHandler接口,HttpServer会调用HttpHandler实现类的回调方法来处理客户端请求,在这里,我们把一个Http请求和它的响应称为一个交换,包装成HttpExchange类,HttpServer负责将HttpExchange传给HttpHandler实现类的回调方法. (摘过来的,也是官方的描述说明)
    通过下面使用一个简单的例子,就可以看到怎么使用它们了,详细的功能可以查看API文档。访问localhost:8086/ 和 localhost:8086/test看看
[java] </pre><pre name="code" class="java">package com.test.myjava; 
 
import java.io.IOException;   
import java.io.OutputStream;  
import java.net.InetSocketAddress;  
import java.util.Queue; 
import java.util.concurrent.*; 
 
import com.sun.net.httpserver.HttpExchange;  
import com.sun.net.httpserver.HttpHandler;  
import com.sun.net.httpserver.HttpServer;  
public class HttpServerTest {  
    public static void main(String[] args) { 
        try { 
            //允许最大连接数  
            int backLog = 10; 
            InetSocketAddress inetSock = new InetSocketAddress(8086); 
            HttpServer httpServer = HttpServer.create(inetSock, backLog); 
            //直接返回Hello.....  
            httpServer.createContext("/", new HandlerTestA()); 
            //显示已经处理的请求数,采用线程池  
            httpServer.createContext("/test",new HandlerTestB()); 
            httpServer.setExecutor(null); 
            httpServer.start(); 
            System.out.println("HttpServer Test Start!"); 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
    } 

 
//直接处理请求  
class HandlerTestA implements HttpHandler{ 
 
    public void handle(HttpExchange httpExchange) throws IOException { 
        // TODO Auto-generated method stub  
        //针对请求的处理部分     
        //返回请求响应时,遵循HTTP协议  
        String responseString = "<font color='#ff0000'>Hello! This a HttpServer!</font>"; 
        //设置响应头  
        httpExchange.sendResponseHeaders(200, responseString.length());    
        OutputStream os = httpExchange.getResponseBody();    
        os.write(responseString.getBytes());    
        os.close();  
    } 
     

//线程池还不会用,简略的使用了下,意思有点差距,后面在分析  
class HandlerTestB implements HttpHandler{ 
    private static int requestNum = 0;  
    ThreadPoolExecutor threadPoolExecutor; 
    HandlerTestB(){ 
        //两个常在线程,最大3个  
         threadPoolExecutor = new  ThreadPoolExecutor(2,3, 30,  
                 TimeUnit.SECONDS,  
                 new ArrayBlockingQueue<Runnable>(2),   
                 new ThreadPoolExecutor.CallerRunsPolicy() 
                 ); 
    } 
    public void handle(HttpExchange he) throws IOException { 
        // TODO Auto-generated method stub  
        if((getQueueSize(threadPoolExecutor.getQueue()))<2){ 
            RequestTasks rqt = new RequestTasks(he);  
            threadPoolExecutor.execute(rqt); 
        } 
        else System.out.println("Please Wait!"); 
    } 
    private synchronized int getQueueSize(Queue queue)   
    {   
        return queue.size();   
    }  
     

 
//处理请求的任务  
class RequestTasks implements Runnable{ 
 
    static int processedNum = 0; 
    HttpExchange httpExchange; 
    RequestTasks(HttpExchange he){ 
        httpExchange = he; 
        processedNum++; 
    } 
    public void run() { 
        // TODO Auto-generated method stub  
        System.out.println("ProcessedNum:" +processedNum); 
        String responseString = "ProcessedNum:" + processedNum + "\n"; 
        try{ 
        httpExchange.sendResponseHeaders(200, responseString.length());    
        OutputStream os = httpExchange.getResponseBody();    
        os.write(responseString.getBytes());    
        os.close(); 
        //去掉注释,看看只能响应两个,有些问题  
        //while(t

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,