druby での超簡易チャットシステム(jruby版)
jruby で書いたチャットシステムが jruby で動作しなかったのは、
$stdout の druby での扱いが ruby/jruby で異なっているのが原因のようだ。
そこで, $stdout の参照を直接 あつかうのではなく、ruby のクラスで包むことにした。
その版では、ruby, jruby とも動作した。
以下にソースを示す。
jserver.rb, jclient.rb, MyStream.rb がある。
$ cat jserver.rb
# 2007-05-20 katoy
# usage: $jruby server.rb
# or $ruby server.rb
#require 'drb/drb'
require 'MyStream'class Chatroom
def initialize
@member = Hash.new
@member["*"] = MyStream.new # "*" is id for server.
enddef login name, stream
@member[name] = stream
broadcast "_", "login: #{name}" # system information
enddef logout name
broadcast "_", "logout: #{name}" # system information
@member.delete name
enddef broadcast name, str
@member.each {|key, val|
val.xxputs "#{name}> #{str}" if key != name
}
enddef list name
stream = @member[name]
@member.each {|key, val|
stream.xxputs " #{key}" unless key == "*"
}
end
enduri = 'druby://localhost:12345'
DRb.start_service uri, Chatroom.new
puts 'Start Chat server...'
DRb.thread.join
#--- End of File ---$ cat jclient.rb
# 2007-05-20 katoy
# usage: $ruby kato druby://loalhost:12350
# or $jruby kato druby://loalhost:12350require 'drb/drb'
require 'MyStream'name = ARGV.shift
uri = ARGV.shiftDRb.start_service(uri)
room = DRbObject.new_with_uri 'druby://localhost:12345'stream = MyStream.new
room.login(name, stream)
while s = gets.chop
next if s == "" # ignore empty line
break if s == 'exit' # logout
room.list(name) if s == "list" # show all member
room.broadcast(name, s) # send message to all member
end
room.logout(name)
#--- End of File ---$ cat MyStream.rb
# 2007-05-20 katoy
#require 'drb/drb'
class MyStream
include DRbUndumpeddef xxputs(str)
puts str
end
end
#--- End of File ---
今度はさらに、$stdout の代わりに、java の System.out を使ってみよう。
cat MyStream.rb
# 2007-05-20 katoy
#require 'drb/drb'
require 'java'
include_class 'JMyStream'class MyStream
include DRbUndumpeddef initialize
@jstream = JMyStream.new
enddef xxputs str
@jstream.xxputs str
end
end
--- End of File ---$ cat JMyStream.java
public class JMyStream {public JMyStream() {
}public void xxputs(final String str) {
System.out.println(str);
}
}
--- End of File ---
これで、ruby クラス/java クラスを リモート/ローカルで呼び出せるようになったことになる。
これらのことを応用すれば、
java クラスを ruby を使って張り合わせ、それらを適宜 分散させて実行するテストフレームワーク
を作れそうな気がする。
来週は java から jruby エンジンを稼働させたとき、呼び出し側のjava 環境の変数/メソッドを jruby コードからアクセスできるかを試したい。
これができれば、xfy の xvcd で書きにくいビジネスロジックを ruby 構文をつかって記述することの実現がぐっと近くなってくる。
« druby での超簡易チャットシステム | トップページ | ピックアップ:XMLは人間が読むものではない, JavaScriptによるガントチャート, etc... »
この記事へのコメントは終了しました。
« druby での超簡易チャットシステム | トップページ | ピックアップ:XMLは人間が読むものではない, JavaScriptによるガントチャート, etc... »
コメント