博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java轻松开发http server
阅读量:4029 次
发布时间:2019-05-24

本文共 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();
}
}
你可能感兴趣的文章
Android系统构架
查看>>
Android 跨应用程序访问窗口知识点总结
查看>>
各种排序算法的分析及java实现
查看>>
SSH框架总结(框架分析+环境搭建+实例源码下载)
查看>>
js弹窗插件
查看>>
自定义 select 下拉框 多选插件
查看>>
js判断数组内是否有重复值
查看>>
js获取url链接携带的参数值
查看>>
gdb 调试core dump
查看>>
gdb debug tips
查看>>
arm linux 生成火焰图
查看>>
jtag dump内存数据
查看>>
linux和windows内存布局验证
查看>>
linux config
查看>>
linux insmod error -1 required key invalid
查看>>
linux kconfig配置
查看>>
linux不同模块completion通信
查看>>
linux printf获得时间戳
查看>>
C语言位扩展
查看>>
linux dump_backtrace
查看>>