mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	 b4489ae953
			
		
	
	
		b4489ae953
		
	
	
	
	
		
			
			https://github.com/ruby/ruby/pull/364 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42086 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
		
			
				
	
	
		
			70 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| =begin
 | |
|  distributed Ruby --- chat server
 | |
|  	Copyright (c) 1999-2000 Masatoshi SEKI
 | |
| =end
 | |
| require 'thread'
 | |
| require 'drb/drb'
 | |
| 
 | |
| class ChatEntry
 | |
|   include DRbUndumped
 | |
| 
 | |
|   def initialize(server, there)
 | |
|     @server = server
 | |
|     @there = there
 | |
|     @name = there.name
 | |
|     @key = there.key = Time.now
 | |
|   end
 | |
|   attr :name, true
 | |
|   attr :there
 | |
| 
 | |
|   def say(str)
 | |
|     @server.distribute(@there, str)
 | |
|   end
 | |
| 
 | |
|   def listen(str)
 | |
|     @there.message(@key, str)
 | |
|   end
 | |
| end
 | |
| 
 | |
| 
 | |
| class ChatServer
 | |
|   def initialize
 | |
|     @mutex = Mutex.new
 | |
|     @members = {}
 | |
|   end
 | |
| 
 | |
|   def add_member(there)
 | |
|     client = ChatEntry.new(self, there)
 | |
|     @mutex.synchronize do
 | |
|       @members[there] = client
 | |
|     end
 | |
|     client
 | |
|   end
 | |
| 
 | |
|   def distribute(there, str)
 | |
|     name = @members[there].name
 | |
|     msg = "<#{name}> #{str}"
 | |
|     msg2 = ">#{name}< #{str}"
 | |
|     @mutex.synchronize do
 | |
|       for m in @members.keys
 | |
|         begin
 | |
|           if m == there
 | |
|             @members[m].listen(msg2)
 | |
|            else
 | |
|             @members[m].listen(msg)
 | |
|           end
 | |
|         rescue
 | |
|           p $!
 | |
|           @members.delete(m)
 | |
|         end
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| end
 | |
| 
 | |
| if __FILE__ == $0
 | |
|   here = ARGV.shift
 | |
|   DRb.start_service(here, ChatServer.new)
 | |
|   puts DRb.uri
 | |
|   DRb.thread.join
 | |
| end
 |