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.
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.puts "#{name}> #{str}" if key != name
}
enddef list name
stream = @member[name]
@member.each {|key, val|
stream.puts " #{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 client.rb
# 2007-05-20 katoy
# usage: $ruby kato druby://loalhost:12350
#require 'drb/drb'
name = ARGV.shift
uri = ARGV.shiftDRb.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版) »
この記事へのコメントは終了しました。
« wirble で irb が使いやすくなる | トップページ | druby での超簡易チャットシステム(jruby版) »
コメント