❄️

HTTP、Javaでウェブサーバーを立ち上げる

2022/10/24に公開

HTTPとは?

WEB上で使われる転送プロコトルである。
現在多くの通信がこれを使用している。

HTTPリクエスト、HTTPレスポンス、HTTPメソッド

HTTPリクエスト:クライアントからサーバーに欲しいデータを要求すること
HTTPレスポンス:リクエストに対してサーバー側から返答すること

HTTPメソッドの種類

HTTPメソッド 説明
GET データの取得
POST データの送信 ※ログイン情報とか
PUT データの作成、書き換え
DELETE データの削除

ステータスコード

HTTPレスポンスの際にステータスとしてどのような状態であるか

コード 説明
200 正常に終了
403 閲覧許可がない
404 上方が見つからない※よく出る
301,302 リダイレクト
500 内部エラー※よく出る

HTTPS

ゲートウェイ:TCP/IPの通信ではサーバーとクライアントの間に複数の中継地点を経由するこのこと
SSL:通信を暗号化する手段
TLS:SSLを標準化したもの

SSL/TLSとも言われたりする

HTTP通信をSSL/TLSで行うようにしたものをHTTPS
ブラウザのURLをみたりするとわかるまた、URLの左に南京錠のようなものがついている。

Javaでウェブサーバーを立ち上げてみよう


import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class WebServer {

    public static void main(String[] args)throws IOException {

        var server = new ServerSocket(8080);
        
        for(;;){
            try (Socket socket = server.accept();
                 var isr = new InputStreamReader(socket.getInputStream());
                 var bur = new BufferedReader(isr);
                 var pw = new PrintWriter(socket.getOutputStream()))
                    
            {
                System.out.println("connected from" 
		+ socket.getInetAddress());
		
                bur.lines()
                        .takeWhile(line -> !line.isEmpty())
                        .forEach(System.out::println);
                
                pw.println("""
                        HTTP/1.1 200 OK
                        Content-Type: text/html
                        
                        <html><head><title>Hello</title></head>
                        <body><h1>hello</h1>sample</body></html>
                        """
                );
            }

        }
    }
}

こんな感じに立ち上がる

8080を指定してソケットを作成するこのポートでアクセスをする

var server = new ServerSocket(8080);

何度もリクエストを受け付けるためこのような書き方をして無限ループを可能にさせ

for(;;)

acceptメソッドを使用して通信を待ち受けれるようにする
クライアントから接続を受け取ったら、その接続を管理するソケットから以下を取得
・BufferedReader
・PrintWriter
これを確実にcloseするようにtry-with-resourcesの構文を使用する

try (Socket soc = server.accept();
                 var isr = new InputStreamReader(soc.getInputStream());
                 var bur = new BufferedReader(isr);
                 var w = new PrintWriter(soc.getOutputStream()))

接続を受け取ってリクエストヘッダーを読み込む
ここで条件が成り立つ間Streamを処理するtakeWhileメソッドを使用してリクエストヘッダー終了の合図であるから行に到達するまで出力処理を行う

bur.lines()
    .takeWhile(line -> !line.isEmpty())
    .forEach(System.out::println);

レスポンスのステータスコードとして200を送る

 HTTP/1.1 200 OK
 Content-Type: text/html

表示するHTML

<html><head><title>Hello</title></head>
<body><h1>hello</h1>sample</body></html>

Discussion