マルチスレッドWebサーバーのNIOベースのJava実装

コード住所:https://github.com/iyuanyb/webserver

用具

  • 静的、動的リソース獲得。

  • クッキー、セッション、長いHTTP接続、およびタイミングおよびHTTPセッションの長いリンクをクリアします。

  • などスプリングMVC注釈同様のプログラミング、  @RequestMapping @RequestParam データはパラメータ受信名による方法から得ることができるような、オブジェクトが渡され、またなどのカスケード属性をサポートすることができます。

    // GET /ページ?のpageSize = 10&PAGENUM = 1 HTTP / 1.1 
    @RequestMapping( "/ページ")
    文字列ページ(@RequestParam(値= "pageSizeを"、はdefaultValue = "10")整数のpageSize、整数PAGENUM){... } 
    
    / ** 
     * POST /ログインHTTP / 1.1 
     * ... 
     * user.name =管理&user.passwd =管理&user.data.val = OK 
     * ******* 
     *ユーザー类:文字列の名前。文字列のpasswd; データDATA; 
     *データ类:文字列のval; 
     * / 
    @RequestMapping( "/ログイン"、メソッド= HttpMethod.POST)
    文字列ログイン(ユーザユーザ){...}
  • 方法のみから、正を使用してテンプレートが達成される、経路テンプレートを表す文字列を返す  request と  session など、プロパティ値のフィールドを取得します  ${request.user.id}

  • ロギング(持つjava.util.loggingロガー、カスタマイズされたログ・フォーマットを使用して構築された)操作ログサーバ(サーバN.LOG)に関連し、HTTPは、ログ(アクセスN.LOG)を要求します。

APIの概要:

@Controller 
@RequestMapping 
@RequestParam 
@RequestHeader 
@CookieValue 
のHttpRequest 
のHttpResponse 
HttpSessionの
クッキー
HTTPMETHOD

 

使用

ノートの使用に関連するインポートのjarパッケージは、(リリースを参照)、また、それが静的なWebリソースのルートパスを表し、クラスパスにwebappディレクトリを作成する必要があります。その後のメインクラスに  main メソッド呼び出し  BootStrap.run()スキャンコントローラは、ディレクトリを横断することによって実現され、そのプロジェクトがパッケージをサポートしていないため、クラスファイルの形で公開する必要があります。Server-config.propertiesパラメータは、クラスパスにプロファイルを提供する必要があり、次の設定項目が含まれています。

#サーバーのポート
PORT = 80 
のパス#ストアログファイルの
LOG_FILE_STORAGE_PATH = E:\\ 
ミリ秒で#接続の有効期限
CONNECTION_EXPIRY_TIME = 30000 
#クリーニング期間満了する接続ミリ秒の
CONNECTION_CLEANING_CYCLE = 30000 
#でのセッションの有効期限(ミリ秒)
SESSION_EXPIRY_TIME = 30000 
#クリーンアップはミリ秒単位で、サイクルのセッションを期限切れ
SESSION_CLEANING_CYCLE = 30000 
クライアントは、スレッド数のイベントを読み込むために#聞く
POLLER_THREAD_COUNT = 2 
#の特定の要求処理スレッドプールサイズ
REQUEST_PROCESSOR_THREAD_COUNT = 4

  

ショー

  • プロジェクト構造

画像-20200311225337531

  • EchoController.java

    com.testパッケージ変更のため; 
    
    //案内パッケージ省略... 
    
    @Controllerコントローラとみなされます//のみ@Controllerマーク
                クラスに注釈を@RequestMapping //サポートし、
    パブリッククラスEchoController { 
    
        //スレッドセーフ
        プライベート最終てDateTimeFormatterフォーマッタ= DateTimeFormatter.ofPattern静的( "MM-DD-YYYY HH:MM:SS"); 
    
        @RequestMapping( "/エコー")// "/エコー"にマッピングされた
        公共の文字列エコー(HttpRequestの要求、@RequestParam(値= "MSG"はdefaultValue = "空の入力")文字列MSG){ 
    
            LocalDateTimeをLocalDateTimeを= LocalDateTime.ofEpochSecond(でrequest.getSession()getLastAccessedTime()/ 1000、0、ZoneOffset.ofHours(8));. 
            request.setAttribute( "lastAccessedTime"、localDateTime.format(フォーマッタ) )。 
            要求。setAttribute( "MSG"、MSG)。
            リターン"test.htmlという"; //テンプレートパスをレンダリングする(CLASSPATH:Webアプリケーション/ test.htmlという)
        } 
    
        パブリック静的無効メイン(文字列[] args){ 
            BootStrap.run(); 
        } 
    }
  • test.htmlという

    <!DOCTYPE> 
    <HTML LANG = "EN"> 
        <HEAD> 
            <TITLE>テスト</ TITLE> 
        </ HEAD> 
        <BODY> 
            <P>エコー:$ {request.msg} </ P> 
            <P>最終アクセスさ時間:$ {request.lastAccessedTime} </ P> 
            <P> <IMG SRC = "IMG / girl.jpg" ALT = "女の子"幅= "320"高さ= "480" /> </ P> 
        </ BODY > 
    </ HTML>
  • 効果

    画像-20200311230536372
  • ジャーナル

    画像-20200311230911751 画像-20200311230942940

おすすめ

転載: www.cnblogs.com/yuanyb/p/12483768.html