サーバを実装するためのクラスです。GServer を継承した新しいクラスを定義して使います。 fork ではなくスレッドを使っています。
#
# 1970年からの経過時間を秒で返すサーバの例です。
#
class TimeServer < GServer
def initialize(port=10001, *args)
super(port, *args)
end
def serve(io)
io.puts(Time.now.to_i)
end
end
# ログを取る設定でサーバをスタートします。
server = TimeServer.new
server.audit = true # Turn logging on.
server.start
# まだサーバが動いているかを確認してみましょう。
GServer.in_service?(10001) # -> true
server.stopped? # -> false
# サーバを止めます。
server.shutdown
# すぐさまサーバを止めることもできます。
GServer.stop(10001)
# もちろん server.stop でも可能です。
GServer.new(port, host = DEFAULT_HOST, maxConnections = 4, stdlog = $stderr, audit = false, debug = false)GServer オブジェクトを生成します。
GServer.in_service?(port, host = DEFAULT_HOST)与えられた host と port で GServer オブジェクトが同じプロセス内で サービス中なら真を返します。
GServer.stop(port, host = DEFAULT_HOST)与えられた host と port に対応する GServer オブジェクトを停止します。
auditaudit=true なら GServer はログを取るためのメソッド starting, connecting, disconnecting, stoppingを それぞれ定められた時に呼びます。
connecting(client)audit が true に設定されているなら、クライアント接続時に呼ばれます。 client はクライアントと接続している TCPSocket です。 サブクラスでオーバーライドします。
connections()現在接続しているクライアントの数を返します。
disconnecting(clientPort)audit が true に設定されているなら、クライアントとの接続終了時に呼ばれます。 clientPort は接続していたクライアントのポートです。 サブクラスでオーバーライドします。
debugdebug=デバッグモードにするかどうかを設定します。
error(detail)debug が true に設定されている時、例外が発生すると呼ばれます。 detail は例外オブジェクトです。protected メソッドです。
hostホストを文字列で返します。
join()サーバのサービスを実行しているスレッドを join します。
log(msg)文字列 msg をログに記録します。protected メソッドです。
maxConnections受け付ける最大接続数を返します。
portポートを数で返します。
serve(io)何もしません。サブクラスでオーバーライドします。
shutdown()GServer を停止します。
start(maxConnections = -1)GServer を起動します。 0 より大きい maxConnections を与えたなら、 最大接続数として設定されます。
starting()audit が true に設定されているなら、サーバ起動時に呼ばれます。 サブクラスでオーバーライドします。
stdlogstdlog=ログを出力する先の IO オブジェクトを設定します。デフォルトは $stderr です。
stop()GServer をすぐに停止します。
stopping()audit が true に設定されているなら、サーバ停止時に呼ばれます。 サブクラスでオーバーライドします。
stopped?()GServer が停止しているなら真を返します。