scalaでhttpサーバーつくり始めました

今日から実際にhttpサーバーをつくり始めました。

コードがりがりかくぞー。

 

まだ全然できてないですが、コンピューターとはなんぞやを知るにはhttpサーバをつくるのが一番近道なのでは?というのが所感です。

 

とはいえサーバーをつくるってどういうこと?ってなると思うんですが、

今日やってみて最後にやっと理解しました。

それをそうやって使うとサーバーってできるんだwwwみたいな。

 

今日やったこと

  • サーバーソケットにホストとポートをバインドさせ接続を待ち受ける状態にする
  • ローカルホストに接続してサーバーを立ち上げる
  • クライアントに文字列を返してみる

と言ってもまずはhttpサーバのしくみや用語を理解していないといけないので、実質やったことで言えばインプットがほとんど。

 

今日理解した用語

これを理解するだけで教材が読めるようになる。

  • 通信プロコトル:ネットワーク上での通信に関する規約(標準的に用いられているのTCP/IPTCP/IP通信をソケット通信と呼ぶ)
  • ソケット:プログラムの世界とTCP/IPの世界を結ぶ特別な出入り口
  • ポート:何と通信するか!(IPアドレスがマンションでポート番号が部屋番号ってかんじ)
  • httpパッケージ:httpリクエスト、レスポンス、URLの解析などを実装し、拡張可能なHTTPサーバと基本的なhttpクライアントを提供するもの
  • ビルド:プログラムの元ネタから実際のプログラムを作る作業(コンパイルはビルドに含まれるhttp://:.com/rico/items/9ab8aa110e757a13ef37)
  • カーネル:パソコンの中の執事!コンピュータ制御の中心。
  • クラスSocket:クライアントソケットを実装する
  • コンストラクタ:クラスからオブジェクトを作成した際に、自動的に実行されるメソッドのこと

 

サーバーのしくみがわかりやすかったのはこれ。

 

サーバーってなにやってるの?

f:id:natsuonatsu:20170201005336p:plain

書いているコードを視覚化するとこれに尽きる。

まずはサーバーソケットを生成してaccept()で待ち状態にする。

そしてクライアント側のソケットと接続されたときにサーバーのソケットとつながる。

そこで会話をはじめます。

今回は一番簡単な文字列を返すように実装しました。

 

ここで、サーバーソケットを生成したり文字列(厳密にはバイト列)を送ったりするメソッドが用意されているのがjava.net。

正直これが全部頑張ってくれた。笑

Java Platform SE 8

 

コードとしてはこんなにシンプルになります!

 

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サーバーだね、ということなのですね。

サーバーをつくるってそういうことか。

ここからも楽しみ〜〜〜〜〜〜〜〜〜〜〜!