簡単なTCPサーバとクライアント

ここでは、rubyを使ってTCPによる通信を行うプログラムを書く方法を説明したいと思います。

TCPとは

インターネットでの通信の90%以上はTCPによるものだと言われています。 通信を行うプログラムを書く場合、ほとんどがTCPによるものになると思います。

インターネットは信頼性のない通信路です。 信頼性がないインターネットでは、通信中にパケットロス、ビットエラー、順番の入れ替えなどが発生する可能性があります。 TCPは、そのような通信路上の障害を隠蔽してくれます。 具体的には、パケットロスが発生したら再送を行ったり、順番が入れ替わると正しい順番に直したりしています。

TCPによる通信はサーバとクライアントの2者間で行われます。 サーバは通信要求が来るまで待ち続けます。 TCPによる通信は、クライアントがサーバに対して接続要求を出すことから始まります。 サーバが接続要求を受け付けるとクライアントとサーバの間に仮想的な接続(バーチャルサーキット)が出来上がります。

プログラムを書く場合、そのソケットがそのバーチャルサーキットを表します。 ユーザがソケットに対して書き込みを行うと、反対側のソケットにそのデータがそのまま転送されます。 そのため、ソケットの両側のユーザは通信路上でのパケットロスなどの障害を気にすることなく、ソケットに対する書き込みと読み出しを行えば通信が行えてしまいます。

TCPプログラミング

TCPによる通信を行うプログラムの書き方はサーバとクライアントで異なります。 以下に、サーバとクライアントのプログラム作成手順概要を示します。

サーバ

サーバは、クライアントからの接続要求を待ちます。 接続要求を待つには、どのような待ち方をするかを設定しないといけません。 設定する情報としては、例えば、接続待ちをするTCPポート番号があります。 一度接続が出来上がってしまえば、サーバとクライアントで通信方法に違いはありません。

クライアント

クライアントは、特定のIPアドレス+TCPポート番号で接続待ちをしているサーバに対して接続要求を出します。 接続が成功すると、通信を開始できます。 一度接続が出来上がってしまえば、サーバとクライアントで通信方法に違いはありません。

単純なTCPサーバ

簡単なサーバのサンプルを以下に示します。 コードを簡単にするため、エラー処理は省いてあります。 実際にコードを書く場合にはエラー処理も行ったコードにして下さい。


#!/usr/bin/ruby

require "socket"

# ポート番号20000番でopen
s0 = TCPServer.open(20000)

# クライアントからの接続を受け付ける
sock = s0.accept

# クライアントからのデータを最後まで受信する
# 受信したデータはコンソールに表示される
while buf = sock.gets
  p buf
end

# クライアントとの接続ソケットを閉じる
sock.close

# 待ちうけソケットを閉じる
s0.close


上記TCPサーバは、接続してきたクライアントが送信してくる文字列を表示して終了します。

単純なTCPクライアント

簡単なクライアントのサンプルを以下に示します。 コードを簡単にするため、エラー処理は省いてあります。 実際にコードを書く場合にはエラー処理も行ったコードにして下さい。


#!/usr/bin/ruby

require "socket"

# 127.0.0.1(localhost)の20000番へ接続
sock = TCPSocket.open("127.0.0.1", 20000)

# HELLOという文字列を送信
sock.write("HELLO")

# 送信が終わったらソケットを閉じる
sock.close


上記TCPクライアントは、サーバに接続すると文字列を送信します。 クライアントが送信した文字列をサーバが受け取ると、サーバ側プログラムが動作しているコンソールに文字列が表示されます。

上記サーバとクライアントの利用方法ですが、まず、サーバ側のプログラムを実行して下さい。 サーバ側のプログラムを実行してある状態でクライアント側のプログラムを実行すると「HELLO」という文字列のやり取りが行われます。

127.0.0.1はlocalhost(自分)を表しています。 そのため、サーバとクライアントのプログラムを実行は同一ホストで行わなければなりません。 クライアントプログラムでサーバのIPアドレスを指定している部分を適切な値に変更すると別ホストでの通信が可能になります。

Windowsで自分のIPアドレスを知りたい場合にはコマンドコンソールで「ipconfig」コマンドを利用するとIPアドレスを知る事ができます。 LinuxやFreeBSDなどのUNIX系システムで自分のIPアドレスを知りたい場合には「ifconfig -a」コマンドを利用するとIPアドレスを知ることが出来ます。

IPv6基礎検定

YouTubeチャンネルやってます!