java.net.socketとjava.net.serversocketに基づいた、比較的単純な単純なJava Webサーバーの実装。
1。プログラムの実行手順
1。サーバーソケットオブジェクトを作成します。
2。Serversocketオブジェクトの受け入れ方法を呼び出して、接続を待ちます。接続が成功した場合、ソケットオブジェクトが返され、それ以外の場合はブロックされて待機されます。
3.ソケットオブジェクトから入力ストリームおよび出力ストリームバイトストリームを取得し、これらの2つのストリームは要求要求と応答の応答にそれぞれ対応します。
4。リクエストを処理します:inputstreamバイトストリーム情報を読み取り、文字列形式に変換し、解析します。ここでの解析は比較的単純であり、URI(均一なリソース識別子)情報のみを取得します。
5。応答の処理:解析されたURI情報に基づいて、Web_Rootディレクトリから要求されたリソースファイルを見つけ、リソースファイルを読み取り、outputStreamバイトストリームに書き込みます。
6.ソケットオブジェクトを閉じます。
7。ステップ2に進み、接続要求を待ち続けます。
2。コード実装
サーバーの実装:
パッケージex01.pyrmont; import java.net.socket; import java.net.serversocket; import java.net.inetaddress; Import java.io.inputStream; Import java.io.outputStream; Import java.io.ioexception; Import Java.io.file httpserver(firecterverv_* ** emptry HTMLおよびその他のファイルが保存されます。ここのweb_rootは、作業ディレクトリ*/ public static final string web_root = system.getProperty( "user.dir") + file.separator + "webroot"; // close service command private static final string shutdown_command = "/shutdown"; public static void main(string [] args){httpserver server = new httpserver(); //接続要求server.await()を待ちます。 } public void await(){Serversocket Serversocket = null; int port = 8080; try {//サーバーソケットオブジェクトServersocket = new Serversocket(port、1、inetAddress.getByname( "127.0.0.1")); } catch(ioexception e){e.printstacktrace(); System.Exit(1); } //(true){socket socket = null; inputstream input = null; outputStream output = null; try {//接続を待っています。接続が成功したら、ソケットオブジェクトソケット= serversocket.accept()を返します。 input = socket.getInputStream(); output = socket.getOutputStream(); //リクエストオブジェクトと解析リクエスト= new request(input); request.parse(); //閉じたサービスコマンドであるかどうかを確認します(request.geturi()。equals(shutdown_command)){break; } //応答オブジェクト応答の作成応答= new Response(output); Response.setRequest(リクエスト); Response.sendstaticResource(); //ソケットオブジェクトsocket.close()を閉じる; } catch(Exception e){e.printstacktrace();続く; }}}}リクエストクラス:
パッケージex01.pyrmont; import java.io.inputStream; Import java.io.ioexception; public class request {private inputstream input;プライベートストリングURI; public request(inputstream input){this.input = input; } // inputstreamからリクエスト情報を読み取り、リクエストpublic void parse(){stringbuffer request = new StringBuffer(2048)からURI値を取得します。 int i; byte [] buffer = new byte [2048]; try {i = input.read(buffer); } catch(ioexception e){e.printstacktrace(); i = -1; } for(int j = 0; j <i; j ++){request.append((char)buffer [j]); } system.out.print(request.toString()); uri = parseuri(request.toString()); } /** * * requestStringの形式は次のとおりです。 index1 = requestString.indexof( ''); if(index1!= -1){index2 = requestString.indexof( ''、index1 + 1); if(index2> index1)RequestString.Substring(index1 + 1、index2)を返します。 } nullを返します。 } public string geturi(){return uri; }}応答クラス:
パッケージex01.pyrmont; import java.io.outputstream; Import java.io.ioexception; Import java.io.fileinputStream; Import java.io.file;/ * http Response = status-line *((general-header | response-haeder | entity-header)crlf)crlf sptp-line spp-line sp-line sp-line sp-line sptp-line Reason-Phrase crlf*/public class Response {private static final int buffer_size = 1024;リクエストリクエスト。出力ストリーム出力。 public Response(outputstream output){this.output = output; } public void setRequest(request request){this.request = request; } public void sendstaticResource()throws ioexception {byte [] bytes = new byte [buffer_size]; fileinputStream fis = null; try {// WebファイルをOutputStream Byte Stream File = new File(httpserver.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 errormessage = "http/1.1 404ファイルが見つかりませんoutput.write(errormessage.getBytes()); }} catch(Exception E){// [ファイル] system.out.println(e.toString())をインスタンス化できない場合はスローされます。 }最後に{if(fis!= null)fis.close(); }}} 3。結果テスト
既存のリソースファイルにアクセスします(プロジェクトディレクトリのWebRootフォルダーに保存されていることに注意してください):
存在しないリソースファイルへのアクセス:
サーバーを閉じます:
参照:「Tomcatの詳細な分析」
@author風のようなコーダー
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。