この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
こんにちわ。wryyyです。
久しぶりのブログ更新です。
さて、今回はRubyのメソッドを拡張したdRubyについて書いていきたいと思います。
【dRubyとは何か?】
Rubyのメソッド呼び出しを拡張し、ネットワーク越しにメソッド呼び出しを行なえるようにするライブラリです。
【Hello, dRuby】
では、実際に「習うより慣れろ!」ということで、早速「Hello, dRuby」を印字するプログラムを見ていきましょう。
※実際の動作確認ではターミナルを2つ使用します。
<ターミナル1>
#server.rb
require 'drb/drb'
class Puts
def initialize(stream=$stdout)
@stream = stream
end
def puts(str)
@stream.puts(str)
end
end
uri = ARGV.shift
DRb.start_service(uri, Puts.new)
puts DRb.uri
sleep
上記プログラムは、サーバとなります。
サーバを起動させてみます。
ruby puts.rb druby://localhost:12345
続いてクライアント側で実験をしていきたいと思います。
<ターミナル2>
irb
irb(main):001:0> require 'drb/drb'
=> true
irbからまず始めにdrbをrequireします。続いて
irb(main):002:0> there = DRbObject.new_with_uri('druby://localhost:12345')
=> #
DRbObject.new_with_uri はURIを指定してオブジェクトの参照を返します。
引数にはサーバ側で指定したURIを指定します
irb(main):003:0> there.puts('Hello, World.')
=> nil
putsでサーバ側に「Hello, World」を入力しました。
サーバ側で「Hello, World」が入力されているか確認してみましょう。
<クライアント1>
druby://localhost:12345
Hello, World.
どうでしょう?サーバ側で「Hello, World」が確認できたでしょうか?
お分かりの通り、dRubyはクライアント側からサーバ側のメソッドを読み出し、サーバ側で処理を行わせることができるのです。
ここまでのやり方ですと、クライアント側はirbで実行させましたが
rubyのスクリプトを書いて実行させることも、もちろんできます。
#client.rb
require 'drb/drb'
uri = ARGV.shift
there = DRbObject.new_with_uri(uri)
there.puts('Hello, World')
上記スクリプトはirbで以前に打ったものとほぼ一緒ですね。
実際にclient.rbを実行させてみましょう。
<ターミナル2>
ruby client.rb druby://localhost:12345
<ターミナル1>
Hello, World
と表示されるはずです。
このようにサーバとクライアントを分けて、ネットワーク越しにメソッドを呼び出し
処理を行えます。
ここまで、単純な形でしたが、これ以外にもスレッド処理等複雑な処理も
行えますので、お試しください。