何度も受信できるTCPサーバ
前述したTCPサーバ例は必要最低限の機能しかありませんでした。 必要最低限だけでは、色々と不具合があります。 例えば、前述したTCPサーバ例では一度クライアントと接続すると終了してしまいます。 ここでは、サーバとして何回もクライアントからの要求を受け付けられるようにTCPサーバ例を改造したいと思います。
何回もクライアントと接続できるサーバ例
一般的なTCPを使ったサーバは、複数回クライアントからの接続を受け付けます。 前述した単純なTCPサーバ例では、一度クライアントからの接続を受け付けたら終了してしまうので、全く実用性はありません。 ここでは、まず、手始めに複数回クライアントからの接続を受け付けられるサーバを作ってみたいと思います。
以下に改造したTCPサーバを示します。
#!/usr/bin/ruby
require "socket"
# クライアントからの接続を待つソケット
s0 = TCPServer.open(20000)
# 常に繰り返す
while true
# クライアントからの接続をacceptする
sock = s0.accept
# クライアントからのデータを全て受け取る
while buf = sock.gets
p buf
end
# acceptしたソケットを閉じる
sock.close
end
# クライアントからの接続を待つソケットを閉じる
# ただし、ここに到達することはありません。
s0.close
今回の改造は、while true部分だけです。 この改造により、前述した単純なTCPクライアントからの接続要求を複数回受け付けられるようになります。
この改造のポイントとして、今回の改造を行った場所と行っていない場所に注目して下さい。
今回改造を行わなかった場所は、「一度だけ行えば良い」部分です。 一度だけ行えば良い部分とは、クライアントからの接続要求を受け付ける準備をする部分です。
逆に、今回改造を行ったwhile trueで囲まれた部分は、「TCPクライアントのセッション毎の処理」を表しています。 毎回、単純なTCPクライアントからの接続要求を受け付けて、文字列を送信して、クライアントとのセッションを終了するという処理がこのwhile trueの中に含まれています。
今回の改造は非常にコードとしては小さいものですが、コード全体が持つ意味は大きく変わっています。 このサンプルを見てTCPセッションを受け付けるための準備と個々のTCPセッションの違いを理解して頂ければ幸いです。
なお、このサンプルは同時に一つのTCPセッションしか確立出来ないという問題があります。 その問題を解決するには、selectを使う/Threadを使う/forkする、などの方法があり得ます。