Javaの大海原をじゃばじゃばと

勉強メモとか雑記です

勉強メモ@プロJava/その8

Webの裏側を見てみる

HTTPリクエスト p.251
HTTPのバージョンについて、下記のこと。

バージョンには1.0か1.1を指定できますが、通常は1.1を使用します。

「プロになるJava」より gihyo.jp

なんで「通常は1.1なん?1.0とどう違うの?」と思ってググったら、下記のこと。そうなんやφ(・

「HTTP 1.0」と「HTTP 1.1」の大きな違いは、keep-alive(キープアライブ)機能にあります。 keep-aliveは、通信を一定期間保った状態とする機能で、画像を含む多く含むページの表示などが速くなる効果があります。 現在のホームページは、ほぼ全てで画像など多くの情報が含まれていますので、「HTTP 1.1」の利用が主流となっています。

参考サイト: www.cman.jp

まずはよくわからんでも書ーーく!!
src/main/java/projava/WebClient.java

package projava;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class WebClient {
    public static void main(String[] args) throws IOException {
        var domain = "example.com";
        try (var soc = new Socket(domain,80);
             var pw = new PrintWriter(soc.getOutputStream());
             var isr = new InputStreamReader(soc.getInputStream());
             var bur = new BufferedReader(isr))
        {
            pw.println("GET /index.html HTTP/1.1");
            pw.println("Host: " + domain);
            pw.println();
            pw.flush();
            bur.lines()
                    .limit(18)
                    .forEach(System.out :: println);
        }
    }
}

▼コンソール
おお!リクエストとレスポンスのラリーができたんだよね!?
ちなみにこの章の内容とは関係ないけどフォントサイズ小さくしたかったので「⌘」+「,」で設定画面を表示して変更。
pleiades.io

HttpClient API
src/main/java/projava/WebClient2.java

package projava;

import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class WebClient2 {
    public static void main(String[] args) throws IOException, InterruptedException {
        HttpClient client = HttpClient.newHttpClient();
        URI uri = URI.create("https://example.com/");
        HttpRequest req = HttpRequest.newBuilder(uri).build();
        HttpResponse<String> response = client.send(req,HttpResponse.BodyHandlers.ofString());
        String body = response.body();
        body.lines()
                .limit(5)
                .forEach(System.out::println);

    }
}

▼コンソール

うーむ、ふむふむ。。。「こう書いたらこうなるのか〜」という感じでまだふわっとしか理解できない。。
が!テキスト1周目なのでとりあえず先へ!!

Webサーバーを作る p.259
src/main/java/projava/WebServer.java

package projava;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class WebServer {
    public static void main(String[] args) throws IOException {
        var server = new ServerSocket(8880);
        for (;;){
            try (Socket soc = server.accept();
                 var isr = new InputStreamReader(soc.getInputStream());
                 var bur = new BufferedReader(isr);
                 var w = new PrintWriter(soc.getOutputStream())
            )
            {
                System.out.println("connected from " + soc.getInetAddress());
                bur.lines()
                        .takeWhile(line -> !line.isEmpty())
                        .forEach(System.out::println);
                w.println("""
                        HTTP/1.1 200 OK
                        Content-Type: text/html
                        
                        <html><head><title>Hello</title></head>
                        <body><h1>Hello</h1>It works!</body></html>
                        """);
            }
        }
    }
}

実行しても、確かに何も表示されない。
▼コンソール

だがブラウザから http://localhost:8880 にアクセスすると…

おお!いっとわーくす!で、コンソールに戻ると、さっきは何も表示されていなかったのに、

だーっとリクエストヘッダーが!

MIMEタイプの変更 p.262
Content-Typeをtext/htmlからtext/plainに変更
で、先ほど同様ブラウザから http://localhost:8880 にアクセスすると…
文字列そのままに表示に。おもしろ( ^ω^ )
ちなみに「plain」は「簡単な」とか「はっきり見える」といった意味なのだね〜
plain とは 意味・読み方・表現 | Weblio英和辞書

これにて第12章は終了!正直仕組みはまだ理解できてないけど「こういうこともできるんだな〜」と(☻-☻)
この次の第13章「処理の難しさの段階」から、文字通りでますます難しくなりそうだぜっ
うほっ