1=begin 2 distributed Ruby --- chat server 3 Copyright (c) 1999-2000 Masatoshi SEKI 4=end 5require 'thread' 6require 'drb/drb' 7 8class ChatEntry 9 include DRbUndumped 10 11 def initialize(server, there) 12 @server = server 13 @there = there 14 @name = there.name 15 @key = there.key = Time.now 16 end 17 attr :name, true 18 attr :there 19 20 def say(str) 21 @server.distribute(@there, str) 22 end 23 24 def listen(str) 25 @there.message(@key, str) 26 end 27end 28 29 30class ChatServer 31 def initialize 32 @mutex = Mutex.new 33 @members = {} 34 end 35 36 def add_member(there) 37 client = ChatEntry.new(self, there) 38 @mutex.synchronize do 39 @members[there] = client 40 end 41 client 42 end 43 44 def distribute(there, str) 45 name = @members[there].name 46 msg = "<#{name}> #{str}" 47 msg2 = ">#{name}< #{str}" 48 @mutex.synchronize do 49 for m in @members.keys 50 begin 51 if m == there 52 @members[m].listen(msg2) 53 else 54 @members[m].listen(msg) 55 end 56 rescue 57 p $! 58 @members.delete(m) 59 end 60 end 61 end 62 end 63end 64 65if __FILE__ == $0 66 here = ARGV.shift 67 DRb.start_service(here, ChatServer.new) 68 puts DRb.uri 69 DRb.thread.join 70end 71