今回の記事では、Rubyを使った基礎的なネットワーク通信について解説します。

TCPによる通信

インターネット上で行われる通信のほとんどはTCPというプロトコル (お互いこの方法でやりとりしましょう, という取り決め) のもと行われています。ウェブページを閲覧する際使われるHTTPも、サーバにログインする際使われるSSHも、TCPの上に実装されているプロトコルです。

TCPには通信の信頼性を上げるための仕組みが組み込まれています。たとえば通信中にデータが失われたり連続して送ったデータが受け取り側で順番が狂ってしまったり、といった事態が発生する可能性があります。そういった時に適切な順序に並び替えたり「失敗したからさっきのもう一回送って」とリクエストしてくれるのがTCPプロトコルです。

RubyからTCP通信を行う基板となるクラスはTCPSocketです。TCPSocketを継承したTCPServerクラスが用意されているので、これを使ってまずはTCP通信を受け取るサーバを作ってみましょう。

TCPサーバ

2000番ポートでTCPServerを作成した後、loopを開始してTCPServer#acceptメソッドで接続を待ちます。相手が接続して来たら、TCPServer#acceptは相手のsocketを返します。あとはそのsocketからデータが送られてくるのを待ち(IO#gets)、送られてきたデータに「:D」を付けてそのまま返すプログラムです。

このサーバに対してtelnetで接続して対話してみます。

「hoge」はtelnet側から入力した文字列、その下の「hoge :D」がサーバから帰ってきた文字列です。想定通り動いていることがわかります。

telnetコマンドを使っても十分役割は果たせるのですが、せっかくなので次のページではクライアント側もRubyで作成してみましょう。