❄️
HTTP、Javaでウェブサーバーを立ち上げる
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