How Tomcat Works読書ノート(第一章)
『How Tomcat Works』という本を読んでいます。ここに読書ノートを貼っています。記憶力が良い方が下手です。
一番簡単なサーバーです。簡単な結果です。
HttpServerはServerSocketを構築し、要求が来るたびにSocketを作成し、Requestを作成し、Reponseオブジェクトを作成し、URIによるとWebRootの下にある静的リソースを読み出す。
クラスは以下の通りです
1.例えばURIを取得する過程では、感じが悪く、一定のフォールト性がない。
2.異常な処理が混乱しているなど
これらのtomcatはすべてとても良い処理を得ましたが、参考になるところがたくさんあります。
ソースはgoogleの中にあります。
http://www.google.com/codesearch/p?hl=en&sa=N&ct=rx&cd=9#X8Q3DKkF7lI/HowTomcatWorks/:java
一番簡単なサーバーです。簡単な結果です。
HttpServerはServerSocketを構築し、要求が来るたびにSocketを作成し、Requestを作成し、Reponseオブジェクトを作成し、URIによるとWebRootの下にある静的リソースを読み出す。
クラスは以下の通りです
package com.ex01.pyrmont;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
public class HttpServer {
public final static String WEB_ROOT = "webRoot";
public final static String SHUT_DOWN = "/SHUTDOWN";
private boolean shutdown = false;
public static void main(String[] args) {
HttpServer httpServer = new HttpServer();
httpServer.await();
}
public void await() {
int port = 8080;
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(port,1,InetAddress.getByName("127.0.0.1"));
} catch (UnknownHostException e) {
e.printStackTrace();
System.exit(1);
} catch (IOException e) {
System.exit(1);
}
Socket socket = null;
InputStream input;
OutputStream out;
while(!shutdown){
try {
socket = serverSocket.accept();
input = socket.getInputStream();
out = socket.getOutputStream();
Request request = new Request(input);
request.parse();
Response response = new Response(out);
response.setRequest(request);
response.sendStaticResource();
input.close();
out.close();
socket.close();
shutdown = request.getUri().equals(SHUT_DOWN);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
package com.ex01.pyrmont;
import java.io.IOException;
import java.io.InputStream;
public class Request {
private InputStream input;
private String uri;
public Request() {}
public Request(InputStream input){
this.input = input;
}
public void parse(){
StringBuffer buffer = new StringBuffer(2048);
byte[] buf = new byte[2048];
int len = 0;
try {
len = input.read(buf);
} catch (IOException e) {
len = 0;
e.printStackTrace();
}
for(int i = 0; i < len; i++){
buffer.append((char)buf[i]);
}
uri = parseUri(buffer.toString());
}
private String parseUri(String uriStr){
int spaceIndex = uriStr.indexOf(" ");
if(spaceIndex != -1){
int spaceSecondIndex = uriStr.indexOf(" ", spaceIndex + 1);
if(spaceSecondIndex > spaceIndex){
return uriStr.substring(spaceIndex + 1,spaceSecondIndex);
}
}
return null;
}
public String getUri(){
return uri;
}
}
package com.ex01.pyrmont;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
public class Response {
public final static int BUFFER_SIZE = 2048;
private OutputStream out;
private Request request;
public Response() {}
public Response(OutputStream out) {
this.out = out;
}
public void sendStaticResource() throws IOException {
String uri = request.getUri();
FileInputStream fis = null;
File file = new File(HttpServer.WEB_ROOT, uri);
if (file.exists()) {
fis = new FileInputStream(file);
byte[] buf = new byte[BUFFER_SIZE];
int len = fis.read(buf);
while (len != -1) {
out.write(buf, 0, len);
len = fis.read(buf);
}
} else {
// file not found
String errorMessage = "HTTP/1.1 404 File Not Found\r
"
+ "Content-Type: text/html\r
" + "Content-Length: 23\r
"
+ "\r
" +
"<h1>File Not Found</h1>";
out.write(errorMessage.getBytes());
}
if(fis != null){
fis.close();
}
}
public void setRequest(Request request) {
this.request = request;
}
}
上の手順は簡単ですが、一定の問題があります。1.例えばURIを取得する過程では、感じが悪く、一定のフォールト性がない。
2.異常な処理が混乱しているなど
これらのtomcatはすべてとても良い処理を得ましたが、参考になるところがたくさんあります。
ソースはgoogleの中にあります。
http://www.google.com/codesearch/p?hl=en&sa=N&ct=rx&cd=9#X8Q3DKkF7lI/HowTomcatWorks/:java