タオルケット体操

サツバツいんたーねっと

Go言語でネットワークのべんきょう

貧弱マンですこんばんわ。

プログラマーになって以降、一度もまともにネットワークの勉強をしたことがなかったのですが、仕事で扱っている製品がソッチ系なのもあって「甘えんな」という周囲の圧力が高まってきました。 ですが参考書読むだけだと5秒で飽きるのは確定的に明らかなので、色々実装しながら雰囲気をつかもうと思いました。

今回はとりあえず、ネットワークプログラミング界のハローワールド的存在っぽいエコーサーバを実装してみることにしました。ですが、C言語はめんどくさそうなのと、最近Go言語がなんか流行ってるっぽいのでそれに乗っかってGoで書いてみました。 あと、書き始めるまえに http://qiita.com/todogzm/items/3c281da10287f7383487 とかを参考に、Vimの補完とかの設定を済ませておくと幸せになれると思います。

ネットワークプログラミング初体験なので、とりあえずエコーサーバの実装例とかをググりまくります。Cでの実装例が多いですが、とりあえず実装に必要な用件は

  • TCPを使う
  • ポートを指定して待ち受ける
  • リクエストを受け付けたら、受け取った文字列をそのまま送り返す

というような雰囲気っぽいです。 ついでに、telnetとか使うのは切ないのでクライアントも実装します。 こっちも同じような感じに、送信して返答を受け取れば良い気がしました。

というわけで、後はGoのドキュメントをみてそれっぽい関数を見つけ出して組み合わせるだけです。 あと、GoはGoroutineとかいうので、go文を使えば簡単に非同期が書けるときいて楽しそうだったので使ってみます。

こんな感じになりました。 関数が基本的に複数の値を返す形になっていて、エラー処理をいい感じに強制してくれるところとかがすごい堅実なアトモスフィアでいいと思いました。

実行してみましょう。 端末でgo run server.goとすれば、スクリプトめいた感じでサーバ用のコードを実行出来ます。 次に、もう一個端末を立ち上げてgo run client.go hogehogehogeeeとします。

すると、なんということでしょう。ちゃんと両方の端末にヤマビコめいたやりとりが成立しています。 なんか余りにも直感的に実装出来すぎて逆に不安なのですが、多分これで正しく実装出来ていると思います。次はDNSのクライアントとか実装しようかと思います。

ついでに、今回はGo言語での初プログラミングだったわけですが、言語仕様とか、go本体を含めた周辺のツールとか(これは言語仕様と同じかそれ以上に大事だと思っている)も洗練されている感じでおもったよりも全然取っ付きやすかったです。当分はこういったコードはGoで書こうかなと思いました。