image

  • フォト Amazonギフト券
    ※この時計の時刻は、閲覧しているパソコンのものであり、必ずしも正確な時間とは限りません

検索

最近のトラックバック

無料ブログはココログ

« druby での超簡易チャットシステム | トップページ | ピックアップ:XMLは人間が読むものではない, JavaScriptによるガントチャート, etc... »

2007-05-20

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.
  end

  def login name, stream
    @member[name] = stream
    broadcast "_", "login: #{name}"  # system information
  end

  def logout name
    broadcast "_", "logout: #{name}" # system information
    @member.delete name
  end

  def broadcast name, str
    @member.each {|key, val|
      val.xxputs "#{name}> #{str}"  if key != name
    }
  end

  def list name
    stream = @member[name]
    @member.each {|key, val|
      stream.xxputs " #{key}" unless key == "*"
    }
  end
end

uri = '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:12350

require 'drb/drb'
require 'MyStream'

name = ARGV.shift
uri = ARGV.shift

DRb.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 DRbUndumped

  def 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 DRbUndumped

  def initialize
    @jstream = JMyStream.new
  end

  def 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 での超簡易チャットシステム(jruby版):

« druby での超簡易チャットシステム | トップページ | ピックアップ:XMLは人間が読むものではない, JavaScriptによるガントチャート, etc... »

mokuji

2013年12月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

google

  • twitter
  • __
  • _
    Googleボットチェッカー

合わせて読む

  • 合わせて読む
    フィードメーター - katoy: cocolog あわせて読みたい

リンク