本文共 4913 字,大约阅读时间需要 16 分钟。
转载:http://www.webspherechina.net/home/space.php?uid=9735&do=blog&id=7666 jdk 6.0 中有一个叫httpserver的包,在这个包的基础上,实现一下HttpHandler接口就可以轻松开发出一个http server! package org.brad.woo.httpserver; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.io.OutputStream; import java.io.PrintStream; import java.net.InetSocketAddress; import java.sql.Timestamp; import java.util.Properties; import java.util.StringTokenizer; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpServer; public class BradooHttpServer { static{ System.out.println("start bradoo http server..."); File logDirectory=new File("./log"); if(!logDirectory.exists()){ logDirectory.mkdirs(); } try { System.setOut(new BradooOut(new FileOutputStream("./log/SystemOut.log"))); System.setErr(new BradooOut(new FileOutputStream("./log/SystemErr.log"))); } catch (FileNotFoundException e) { e.printStackTrace(); } } /** * @param args */ public static void main(String[] args) { int serverPort=Integer.parseInt((String)Configuration.config.getProperty("server_port")); try { HttpServer hs=HttpServer.create(new InetSocketAddress(serverPort), 0); hs.createContext("/", new BradooHandler()); hs.start(); System.out.println("A http Server is started in port "+serverPort+"!"); } catch (IOException e) { e.printStackTrace(); } } } class BradooOut extends PrintStream{ public BradooOut(FileOutputStream out) { super(out); } public void println(String str){ super.println(new Timestamp(System.currentTimeMillis()).toString()+" - "+str); } } class Configuration{ public static Properties config; static{ config=new Properties(); try { config.load(Configuration.class.getClassLoader().getResourceAsStream("httpd.properties")); System.out.println(config); } catch (IOException e) { e.printStackTrace(); } } } class BradooHandler implements HttpHandler{ @Override public void handle(HttpExchange arg0) throws IOException { String baseDirectory=(String)Configuration.config.getProperty("server_base_directory"); if(baseDirectory.endsWith("/")) baseDirectory=baseDirectory.substring(0,baseDirectory.length()-1); String reqURI=arg0.getRequestURI().toString(); if(!reqURI.endsWith("/")) reqURI+="/"; System.out.println("RequestURI="+reqURI); File reqFile=new File(baseDirectory+reqURI); OutputStream ut=arg0.getResponseBody(); if(!reqFile.exists()){ String response="400, the file "+reqURI+" is not found!"; System.out.println("400="+response); arg0.sendResponseHeaders(200, response.length()); byte[] b=response.getBytes(); out.write(b, 0, b.length); }else if(reqFile.isFile()){ FileInputStream is=new FileInputStream(baseDirectory+reqURI); int fileLength=is.available(); is.close(); arg0.sendResponseHeaders(200, fileLength); BufferedReader br=new BufferedReader(new FileReader(baseDirectory+reqURI)); String line=null; while((line=br.readLine())!=null){ byte[] b=line.getBytes(); out.write(b, 0, b.length); } br.close(); }else if(reqFile.isDirectory()){ StringTokenizer st=new StringTokenizer((String)Configuration.config.getProperty("welcome_file_list")," "); File welFile=null; StringBuffer welFilePath=null; boolean isFound=false; while(st.hasMoreTokens()){ welFilePath=new StringBuffer(); welFilePath.append(baseDirectory); welFilePath.append(reqURI); welFilePath.append((String)st.nextToken()); //System.out.println("welFilePath="+welFilePath.toString()); welFile=new File(welFilePath.toString()); if(welFile.exists()){ isFound=true; break; } } if(isFound){ FileInputStream is=new FileInputStream(welFilePath.toString()); int fileLength=is.available(); is.close(); arg0.sendResponseHeaders(200, fileLength); BufferedReader br=new BufferedReader(new FileReader(welFilePath.toString())); String line=null; while((line=br.readLine())!=null){ byte[] b=line.getBytes(); out.write(b, 0, b.length); } br.close(); }else{ File[] fileList=reqFile.listFiles(); StringBuffer sb=new StringBuffer(); sb.append("<html><head><title>Directory</title></head><body><table border=1>"); sb.append("<tr><td>Type</td><td>Name</td></tr>"); if(!reqURI.equals("/")){ sb.append("<tr><td>Parent Directory:</td><td><a xhref="); String parentDirecotry=reqURI.substring(0,reqURI.substring(0, reqURI.length()-1).lastIndexOf("/")+1); sb.append(parentDirecotry); sb.append(">"); sb.append(parentDirecotry); sb.append("</a></td></tr>"); } for(int i=0;i<fileList.length;i++){ sb.append("<tr><td>"); sb.append(fileList[i].isFile()?"F":"D"); sb.append("</td><td><a xhref="); sb.append(reqURI); sb.append(fileList[i].getName()); sb.append(">"); sb.append(fileList[i].getName()); sb.append("</a></td></tr>"); } sb.append("</table></body></html>"); arg0.sendResponseHeaders(200, sb.capacity()); byte[] b=sb.toString().getBytes(); out.write(b, 0, b.length); } } out.close(); } }