httpserver
package com.whatsmars.tomcat.servlet;
import java.io.ioexception;
import java.io.inputstream;
import java.io.outputstream;
import java.net.inetaddress;
import java.net.serversocket;
import java.net.socket;
/**
* created by shenhongxi on 16/3/21.
*/
public class httpserver {
private static final string shutdown_command = "/shutdown";
private boolean shutdown = false;
public static void main(string[] args) {
httpserver server = new httpserver();
server.await();
}
private void await() {
serversocket serversocket = null;
int port = 8080;
try {
serversocket = new serversocket(port, 1, inetaddress.getbyname("127.0.0.1"));
system.out.println("server started!");
} catch (ioexception e) {
e.printstacktrace();
system.exit(1);
}
while (!shutdown) {
socket socket = null;
inputstream input = null;
outputstream output = null;
try {
socket = serversocket.accept();
input = socket.getinputstream();
output = socket.getoutputstream();
request request = new request(input);
request.parse();
response response = new response(output);
response.setrequest(request);
// check if this is a request for a servlet or a static resource
if (request.geturi().startswith("/servlet/")) {
servletprocessor processor = new servletprocessor();
processor.process(request, response);
} else {
staticresourceprocessor processor = new staticresourceprocessor();
}
socket.close();
shutdown = request.geturi().equals(shutdown_command);
} catch (exception e) {
e.printstacktrace();
continue;
}
}
request
import javax.servlet.*;
import java.io.bufferedreader;
import java.io.unsupportedencodingexception;
import java.util.enumeration;
import java.util.locale;
import java.util.map;
public class request implements servletrequest {
private inputstream input;
private string uri; // 性能考慮,用byte[]
public request(inputstream input) {
this.input = input;
public void parse() {
stringbuffer request = new stringbuffer(2048);
int i;
byte[] buffer = new byte[2048];
i = input.read(buffer);
i = -1;
for (int j = 0; j < i; j++) {
request.append((char) buffer[j]);
system.out.println(request.tostring());
uri = parseuri(request.tostring());
private string parseuri(string requeststr) {
// get /index.html http/1.1
// accept: text/plain; text/html
// ...
int index1 = requeststr.indexof(' ');
int index2;
if (index1 != -1) {
index2 = requeststr.indexof(' ', index1 + 1);
if (index2 > index1) {
return requeststr.substring(index1 + 1, index2);
return null;
public string geturi() {
return uri;
public object getattribute(string name) {
public enumeration<string> getattributenames() {
public string getcharacterencoding() {
public void setcharacterencoding(string env) throws unsupportedencodingexception {
public int getcontentlength() {
return 0;
response
import javax.servlet.servletoutputstream;
import javax.servlet.servletresponse;
import java.io.*;
public class response implements servletresponse {
private static final int buffer_size = 1024;
request request;
outputstream output;
printwriter writer;
public void sendstaticresource() throws ioexception {
byte[] bytes = new byte[buffer_size];
fileinputstream fis = null;
file file = new file(constants.web_root, request.geturi());
if (file.exists()) {
fis = new fileinputstream(file);
int ch = fis.read(bytes, 0, buffer_size);
while (ch != -1) {
output.write(bytes, 0, ch);
ch = fis.read(bytes, 0, buffer_size);
} else {
string errormsg = "http/1.1 404 file not found\r\n" +
"content-type: text/html\r\n" +
"content-length: 23\r\n" +
"\r\n" +
"<h1>file not found</h1>";
output.write(errormsg.getbytes());
} catch (exception e) {
} finally {
if (fis != null) {
fis.close();
public response(outputstream output) {
this.output = output;
public void setrequest(request request) {
this.request = request;
public string getcontenttype() {
public servletoutputstream getoutputstream() throws ioexception {
public printwriter getwriter() throws ioexception {
// autoflush is true, println() will flush, but print() will not
writer = new printwriter(output, true);
return writer;
requestfacade
* created by shenhongxi on 2016/4/12.
public class requestfacade implements servletrequest {
private servletrequest request;
public requestfacade(request request) {
return request.getattribute(name);
return request.getattributenames();
responsefacade
import java.io.printwriter;
public class responsefacade implements servletresponse {
private servletresponse response;
public responsefacade(response response) {
this.response = response;
return response.getcharacterencoding();
return response.getwriter();
servletprocessor
import javax.servlet.servlet;
import javax.servlet.servletrequest;
import java.io.file;
import java.net.url;
import java.net.urlclassloader;
import java.net.urlstreamhandler;
public class servletprocessor {
public void process(request request, response response) {
string uri = request.geturi();
string servletname = uri.substring(uri.lastindexof("/") + 1);
urlclassloader loader = null;
url[] urls = new url[1];
urlstreamhandler streamhandler = null;
file classpath = new file(constants.web_root);
string repository = (new url("file", null, classpath.getcanonicalpath()
+ file.separator)).tostring();
urls[0] = new url(null, repository, streamhandler);
loader = new urlclassloader(urls);
class myclass = null;
myclass = loader.loadclass(servletname);
} catch (classnotfoundexception e) {
servlet servlet = null;
servlet = (servlet) myclass.newinstance();
requestfacade requestfacade = new requestfacade(request);
responsefacade responsefacade = new responsefacade(response);
// 為了安全考慮,除了實作servletrequest/servletresponse的方法,
// request/response中的其他公共方法需對servlet隐藏,是以用外觀類
servlet.service((servletrequest) requestfacade, (servletresponse) responsefacade);
} catch (throwable e) {
staticresourceprocessor
public class staticresourceprocessor {
response.sendstaticresource();
primitiveservlet
public class primitiveservlet implements servlet {
public void init(servletconfig config) throws servletexception {
system.out.println("init");
public servletconfig getservletconfig() {
public void service(servletrequest req, servletresponse res) throws servletexception, ioexception {
system.out.println("from service");
printwriter out = res.getwriter();
out.println("hello. roses are red.");
out.print("violets are blue");
public string getservletinfo() {
public void destroy() {
system.out.println("destroy");
constants
public class constants {
public static final string web_root = system.getproperty("user.dir") + file.separator + "whatsmars-tomcat/src/main/webapp"; // 資源檔案,class檔案等
原文連結:[http://wely.iteye.com/blog/2290575]