scalaでhttpサーバーつくり始めました
今日から実際にhttpサーバーをつくり始めました。
コードがりがりかくぞー。
まだ全然できてないですが、コンピューターとはなんぞやを知るにはhttpサーバをつくるのが一番近道なのでは?というのが所感です。
とはいえサーバーをつくるってどういうこと?ってなると思うんですが、
今日やってみて最後にやっと理解しました。
それをそうやって使うとサーバーってできるんだwwwみたいな。
今日やったこと
- サーバーソケットにホストとポートをバインドさせ接続を待ち受ける状態にする
- ローカルホストに接続してサーバーを立ち上げる
- クライアントに文字列を返してみる
と言ってもまずはhttpサーバのしくみや用語を理解していないといけないので、実質やったことで言えばインプットがほとんど。
今日理解した用語
これを理解するだけで教材が読めるようになる。
- 通信プロコトル:ネットワーク上での通信に関する規約(標準的に用いられているのTCP/IP、TCP/IP通信をソケット通信と呼ぶ)
- ソケット:プログラムの世界とTCP/IPの世界を結ぶ特別な出入り口
- ポート:何と通信するか!(IPアドレスがマンションでポート番号が部屋番号ってかんじ)
- httpパッケージ:httpリクエスト、レスポンス、URLの解析などを実装し、拡張可能なHTTPサーバと基本的なhttpクライアントを提供するもの
- ビルド:プログラムの元ネタから実際のプログラムを作る作業(コンパイルはビルドに含まれるhttp://:.com/rico/items/9ab8aa110e757a13ef37)
- カーネル:パソコンの中の執事!コンピュータ制御の中心。
- クラスSocket:クライアントソケットを実装する
- コンストラクタ:クラスからオブジェクトを作成した際に、自動的に実行されるメソッドのこと
サーバーのしくみがわかりやすかったのはこれ。
- サーバーソケットについて:http://www.techscore.com/tech/Java/JavaSE/Network/3/
サーバーってなにやってるの?
書いているコードを視覚化するとこれに尽きる。
まずはサーバーソケットを生成してaccept()で待ち状態にする。
そしてクライアント側のソケットと接続されたときにサーバーのソケットとつながる。
そこで会話をはじめます。
今回は一番簡単な文字列を返すように実装しました。
ここで、サーバーソケットを生成したり文字列(厳密にはバイト列)を送ったりするメソッドが用意されているのがjava.net。
正直これが全部頑張ってくれた。笑
コードとしてはこんなにシンプルになります!
import java.net.ServerSocket
import java.net.Socket
import java.io
object HTTPServer {
def main(args: Array[String]): Unit = {
println("Hello HTTP Server!Strat----->")
val serverSocket = new ServerSocket(8000)
println("Serving HTTP on localhost port 8000 ...")
serverSocket.accept()
//acceptし続ける
while (true) {
val socket = serverSocket.accept()println("Hello Request!")
val output = socket.getOutputStream()
output.write("HTTP/1.1 200 OK\r\n\r\nhello,cliant!".getBytes("UTF-8"))output.close()
}
}
}
writeメソッドがややこしい。
ヘッダー(HTTP/1.1 200 OK)をつけなきゃいけないし、 文字列をそのままいれられないからバイト列に変換しました!
これを、html文を送って読み取れるようにしたり、画像も送れるようになったら立派なhttpサーバーだね、ということなのですね。
サーバーをつくるってそういうことか。
ここからも楽しみ〜〜〜〜〜〜〜〜〜〜〜!