image

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

検索

最近のトラックバック

無料ブログはココログ

« wirble で irb が使いやすくなる | トップページ | druby での超簡易チャットシステム(jruby版) »

2007-05-20

druby での超簡易チャットシステム

druby の解説ページ
- http://www2a.biglobe.ne.jp/%7Eseki/ruby/d205.html
> > 5 pass by reference, pass by value
に、stdout の参照をサーバー側に登録する例がある。

これを応用して、簡易チャットシステムを作ってみた。
アイデアは次のとうり。
- サーバー側では、ハッシュで {name, $stdout} の組で、クライアント情報を保持する。
- クライアントからのメッセージを、ハッシュ中のすべての $stdoutに puts する。

使い方は
  ターミナル1: $ ruby server.rb
  ターミナル2: $ ruby client.rb foo druby://localhost:12340
  ターミナル3: $ ruby client.rb foo druby://localhost:12341
                  (クライアント毎に port は異なるものを指定する必要がある)

client では、 "exit" を入力すると、logout してプログラム終了する。
              "list" を入力すると、login しているユーザー名一覧を表示する。
              空行は無視
              それ以外の入力行は、他のクライアント、サーバーのコンソールに表示される。

以下にプログラムを示す。

$ cat server.rb
# 2007-05-20 katoy
# usage: $ruby server.rb
#      

require 'drb/drb'

class Chatroom
  def initialize
    @member = Hash.new
    @member["*"] = $stdout  # "*" 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.puts "#{name}> #{str}"  if key != name
    }
  end

  def list name
    stream = @member[name]
    @member.each {|key, val|
      stream.puts " #{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 client.rb
# 2007-05-20 katoy
# usage: $ruby kato druby://loalhost:12350
#

require 'drb/drb'

name = ARGV.shift
uri = ARGV.shift

DRb.start_service(uri)
room = DRbObject.new_with_uri 'druby://localhost:12345'

room.login name, $stdout

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

この程度の行数で作れてしまうとは驚き。(エラー処理、mutex 処理などは抜けてるけど)
java で同様のものを作ろうとしたら、それなりの量を記述する必要があるし、
修正の度に compile が必要で、時間もかかるだろう。

上記のプログラムは、jruby では なぜか動作しない。
server は起動できるが、client を起動すると、次のエラーが出て起動できない。
/Users/kato/work/www/jruby-1.0.0RC1/lib/ruby/1.8/drb/drb.rb:585:in `load': Ruby "NativeException" object can not be allocated (TypeError)
        from /Users/kato/work/www/jruby-1.0.0RC1/lib/ruby/1.8/drb/drb.rb:585:in `load'
        from /Users/kato/work/www/jruby-1.0.0RC1/lib/ruby/1.8/drb/drb.rb:633:in `exclusive'
        from /Users/kato/work/www/jruby-1.0.0RC1/lib/ruby/1.8/drb/drb.rb:594:in `load'
        from /Users/kato/work/www/jruby-1.0.0RC1/lib/ruby/1.8/drb/drb.rb:633:in `recv_reply'
        from /Users/kato/work/www/jruby-1.0.0RC1/lib/ruby/1.8/drb/drb.rb:921:in `recv_reply'
        from /Users/kato/work/www/jruby-1.0.0RC1/lib/ruby/1.8/drb/drb.rb:1195:in `send_message'
        from /Users/kato/work/www/jruby-1.0.0RC1/lib/ruby/1.8/drb/drb.rb:1086:in `method_missing'
        from client.rb:14:in `open'
        from /Users/kato/work/www/jruby-1.0.0RC1/lib/ruby/1.8/drb/drb.rb:1087:in `method_missing'
        from client.rb:14:in `with_friend'
        from /Users/kato/work/www/jruby-1.0.0RC1/lib/ruby/1.8/drb/drb.rb:1089:in `method_missing'
        from client.rb:14

このチャットシステムの GUI を xfy/xvcd で作る事はできるか?
$stdout へ出力されたことのイベントをキャッチして、xfy の画面更新するが出来る必要がある。どうすれば良い?...

xfy の メモリー上の srcDOMの参照を server に登録して、サーバーが srcDOM に変更を加える?
srcDOM を変更する xfy メソッドを server から呼び出す?

« wirble で irb が使いやすくなる | トップページ | druby での超簡易チャットシステム(jruby版) »

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: druby での超簡易チャットシステム:

« wirble で irb が使いやすくなる | トップページ | druby での超簡易チャットシステム(jruby版) »

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 あわせて読みたい

リンク