Javaによる簡易Tomcatサーバの実現(わかりやすい)
4024 ワード
Tomcatサーバは軽量レベルのJavaコード実装のWEBサーバである.この記事では、Javaで簡易版のTomcatサーバを実現する方法について説明します.
簡単に言えば、簡単な原理はこうです.
1.Tomcatが実行を開始すると、ホスト上にポート(デフォルトは80ポート)が開き、開いているポート上でサーバSocketが実行され、accept()メソッドが実行されてブラウザのアクセスを待機します.
2.ブラウザがターゲットホストの80ポートにアクセスし、サーバSocketのaccept()メソッドは、getInputStream()メソッドとgetOutputStreamメソッドがあり、ブラウザがサーバに送信したコンテンツとブラウザに応答してコンテンツを送信することができるサーバ側で実行されるsocketを返します.
3.ブラウザはサーバ応答の内容を受け取り、ブラウザの解釈によって、内容がユーザーの目の前に表示される.
注意:
1.ブラウザがサーバに送信するアクセス要求はHTTPプロトコルに適合する.
2.ブラウザは、サーバのようにHTMLページを要求してもよいし、ピクチャを要求してもよい.HTMLページにピクチャまたはcss,jsがインポートされた場合、これらのコンテンツはサーバの要求のようにもなり、サーバはファイル名に基づいてブラウザに応答し、サーバディレクトリにファイルが見つからない場合は404エラーを返す.
3.この簡易Tomcatサーバは静的リソースにのみ適用されます.
4.この簡易Tomcatは2つのクラスに分けられ、ServerクラスとHandlerクラスに分けられ、Serverクラスは要求を受信し、サブスレッドを作成し、Handlerクラスでブラウザから送信された要求を処理し、フィードバックする.
コードおよびコメントは次のとおりです.
Handlerクラス:
簡単に言えば、簡単な原理はこうです.
1.Tomcatが実行を開始すると、ホスト上にポート(デフォルトは80ポート)が開き、開いているポート上でサーバSocketが実行され、accept()メソッドが実行されてブラウザのアクセスを待機します.
2.ブラウザがターゲットホストの80ポートにアクセスし、サーバSocketのaccept()メソッドは、getInputStream()メソッドとgetOutputStreamメソッドがあり、ブラウザがサーバに送信したコンテンツとブラウザに応答してコンテンツを送信することができるサーバ側で実行されるsocketを返します.
3.ブラウザはサーバ応答の内容を受け取り、ブラウザの解釈によって、内容がユーザーの目の前に表示される.
注意:
1.ブラウザがサーバに送信するアクセス要求はHTTPプロトコルに適合する.
2.ブラウザは、サーバのようにHTMLページを要求してもよいし、ピクチャを要求してもよい.HTMLページにピクチャまたはcss,jsがインポートされた場合、これらのコンテンツはサーバの要求のようにもなり、サーバはファイル名に基づいてブラウザに応答し、サーバディレクトリにファイルが見つからない場合は404エラーを返す.
3.この簡易Tomcatサーバは静的リソースにのみ適用されます.
4.この簡易Tomcatは2つのクラスに分けられ、ServerクラスとHandlerクラスに分けられ、Serverクラスは要求を受信し、サブスレッドを作成し、Handlerクラスでブラウザから送信された要求を処理し、フィードバックする.
コードおよびコメントは次のとおりです.
package com.yykj;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
Server server = new Server();
server.startServer();
}
public void startServer(){
try {
ServerSocket serverSocket = new ServerSocket(80);// 80
System.out.println(" >>> 80 ");
while(true){// , 80
Socket socket = serverSocket.accept();
Thread thread = new Thread(new Handler(socket));// ,
System.out.println(" ");
thread.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Handlerクラス:
package com.yykj;
import java.io.*;
import java.net.Socket;
//
public class Handler implements Runnable {
private Socket socket;
private OutputStream outputStream;
private InputStream inputStream;
private BufferedReader reader;
private PrintWriter writer;
private static String WEB_ROOT = "C:\\Users\\Administrator\\Desktop\\web";//
public Handler(Socket socket){
this.socket = socket;
}
@Override
public void run(){
try{
inputStream = socket.getInputStream();//
outputStream = socket.getOutputStream();//
reader = new BufferedReader(new InputStreamReader(inputStream));//
writer = new PrintWriter(new OutputStreamWriter(outputStream));//
String msg;//
StringBuffer request = new StringBuffer();//
while((msg = reader.readLine()) != null && msg.length() > 0){
request.append(msg);
request.append("
");//HTTP
}
String[] msgs = request.toString().split(" ");//HTTP
//msgs[1] HTTP ,
/* if(msgs[1].endsWith(".ico")){//.ico ,
writer.println("HTTP/1.1 200 OK");// .ico , , ,
writer.println("Content-Type: text/html;charset=UTF-8");
writer.close();
// ,
return;
}*/
//
FileInputStream fileInputStream = new FileInputStream(new File(WEB_ROOT + msgs[1]));
byte[] fileBuffer = new byte[1024];// , byte
int length = 0;
while((length = fileInputStream.read(fileBuffer)) != -1){
outputStream.write(fileBuffer, 0, length);//
}
outputStream.close();
inputStream.close();
reader.close();
fileInputStream.close();
}catch (IOException e){
// , , 404
writer.write("HTTP/1.1 404 ERROR:FILE NOT FINDED");
writer.close();
}
}
}