Webサーバーとクライアント間の通信がHTTPプロトコルを使用することはよく知られています。 HTTPは、クライアントおよびサーバーのリクエストと応答(TCP)の標準です。 HTTPプロトコルはTCPプロトコルに基づいているため、Javaのソケットを使用してこのシンプルなWebサーバーを完成させます。より詳細なHTTP情報については、関連する情報を参照して学習できます。
サーバーを書き込む前に、ブラウザとサーバーの間の通信ルールを見てみましょう。
まず、Serversocketを使用してサーバーをシミュレートし、ブラウザからアクセスし、ブラウザが要求したコンテンツを表示します。
java.io.bufferedwriter; Import java.io.inputstream; import java.outputStreamWriter; Import Java.net.inetAddress; Import java.net.inetsocketAddress; Import java.net.serversocket; Import Java.net.socket.socket; @author jianggujin * */public class hqhttpprotocoltest {@test public void server()throws Exception {serversocket serversocket = new Serversocket(80); Socket Socket = Serversocket.Accept(); inputstream stream = socket.getInputStream(); int r = -1; while((r = stream.read())!= -1){system.out.print((char)r); }}}Junitで実行し、ブラウザを介してアクセスしてください: http://127.0.0.1では、コンソールのブラウザの要求コンテンツ出力が次のとおりであることがわかります。
Get/HTTP/1.1HOST:127.0.0.1Connection:Keep-AliveCcept:Text/HTML、Application/XHTML+XML、Application/XML; Q = 0.9、Image/Webp、*/*; Q = 0.8user-Agent:Mozilla/5.0(Windows Nt 5.1)Applewebkit/537.3 Gecko)Chrome/31.0.1650.63 Safari/537.36ACCEPT-ENCODING:GZIP、DEFLATE、SDCHACCEPT-LANGAGE:ZH-CN、ZH; Q = 0.8
リクエストコンテンツをより適切に分析するために、HTMLページを作成してデータを送信し、リクエストコンテンツを再度表示します。
<!doctype html> <html> <head> <meta charset = "utf-8"> <title> test </head> </head> <body> <form method = "post" action = "http://127.0.1?test=123"> <入力タイプ= "" name "/>> <input type = "submit"/> </form> </body> </html>
入力ボックスにボブを入力し、ボタンをクリックして送信し、コンソールの出力を観察します。
post/?test = 123 HTTP/1.1HOST:127.0.0.1Connection:Keep-AliveContent-Length:8Cache-Control:Max-age = 0accept:text/html、application/xhtml+xml、application/xml; q = 0.9、image/*; q = 0.8origin:moligina:moligina:moligina:moligina:emigina (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36Content-Type: application/x-www-form-urlencodedAccept-Encoding: gzip,deflate,sdchAccept-Language: zh-CN,zh;q=0.8name=bob
このリクエストの内容を分析しましょう。
1行目:中央のスペースで区切られた3つの部分で構成され、最初の部分はリクエストメソッド(get、post)です。2番目の部分はリクエストパスとクエリパラメーター、3番目の部分はHTTPプロトコルバージョン(HTTP/1.1)です。
行2から10行目:リクエストのヘッダー情報、リクエストヘッダーの名前と値が渡されます。11行目を分離:空の行12行:提出されたフォームコンテンツ、次の結論を取得できます。リクエスト情報の最初の動作はリクエスト方法、クエリパラメーター、およびHTTPプロトコルバージョンです。 /r /nラインブレークの後、リクエストヘッダー情報の後に /r /nラインブレークが続き、リクエストヘッダー情報の後にリクエストヘッダー情報が完了し、リクエストデータの後に空白行が続きます。これはシミュレートされるだけであることに注意する必要があります。複雑なファイルの提出などについては、ここでは説明されておらず、リクエストコンテンツ形式はわずかに異なります。
この時点で、クライアントが要求したコンテンツを既に知っています。リクエストを受信した後、サーバーの応答データの形式を見てみましょう。次のように、HTMLページのコンテンツをテストおよび編集するための新しいWebプロジェクトを作成します。
<!doctype html> <html> <head> <meta charset = "utf-8"> <title>テスト</title> </head> <body>これはテストページです。</body> </html>
サーバーを起動してから、クライアントテストコードを書き込み、サーバーの返品データを取得します。
java.io.bufferedwriter; Import java.io.inputStream; Import java.io.outputStreamWriter; Import java.net.serversocket; import java.net.socket; import junit.test;/** * httpプロトコルテスト * @author jianggujin */public class hqhttpprotocoltest {public void server()スロー例外{Serversocket Serversocket = new Serversocket(80); Socket Socket = Serversocket.Accept(); inputstream stream = socket.getInputStream(); // bufferedInputStream inputstream = new BufferedInputStream(Stream); int r = -1; while((r = stream.read())!= -1){system.out.print((char)r); }} @test public void client()throws Exception {socket socket = new Socket( "127.0.0.1"、80); BufferedWriter writer = new BufferedWriter(new outputStreamWriter(socket.getOutputStream())); writer.write( "get /servlet/test.html http/1.1/r/n"); writer.write( "host:127.0.0.1/r/n"); writer.write( "Connection:Keep-Alive/r/n"); writer.write( "accept:text/html、application/xhtml+xml、application/xml; q = 0.9、image/webp、*/*; q = 0.8/r/n"); writer.write( "user-agent:mozilla/5.0(windows nt 5.1)applewebkit/537.36(khtml、yike gecko)chrome/31.0.1650.63 safari/537.36/r/n"); writer.write( "accept-encoding:gzip、deflate、sdch/r/n"); writer.write( "accept-language:zh-cn、zh; q = 0.8/r/n"); writer.write( "/r/n"); writer.flush(); inputstream stream = socket.getInputStream(); int r = -1; while((r = stream.read())!= -1){system.out.print((char)r); }}}サーバーを取得するためにプログラムを実行すると、次のコンテンツが返されます。
HTTP/1.1 200 Okserver:Apache-Coyote/1.1accept-range:bytesetag:w/"129-1456125361109"ラスト修飾:Mon、22 Feb 2016 07:16:01 GMTCONTENT-TYPE:TEXT/HTMLCONTENT-LENGTER:129DATE-LENGTE:129DATE-LENGTE:129DATE-LENGTE gmt <!doctype html> <html> <head> <head> <メタcharset = "utf-8"> <title>テスト</title> </head> <body>これはテストページです。</body> </html>
同様に、この返品メッセージを分析しましょう。
The first line consists of three parts, separated by spaces in the middle, the first part is the HTTP protocol version (HTTP/1.1), the second part is the response status code, and the third part is the response status description of the second line to the seventh line, the response header information is passed between the response header name and the value: Separate the eighth line: the ninth line to the end of the response content: In summary, we can get the following結論:最初のことは、リクエスト情報HTTPプロトコルバージョン、応答ステータスコード、応答ステータスの説明、および応答ヘッダー情報の後に /r /nラインブレークが続き、応答ヘッダー情報の後に応答ヘッダー情報の後に応答ヘッダー情報が完了し、応答データの後に応答データが続きます。この応答に加えて、ここでは議論されていないChunkなど、他の対応する方法が実際にあることに注意してください。関連情報を確認できます。
これまでに、クライアントのリクエストコンテンツ形式とサーバーの対応するコンテンツ形式を分析しました。この記事はここで終わります。みんなの学習に役立つことを願っています。