6 12, 2004

Ruby·Ö²¼Ê½¶ÔÏó

×îºó£¬ÎÒÃÇÀ´¿´¿´RubyÖеķֲ¼Ê½±à³Ì¡£ÏÖÔÚÍøÂçÒѾ­·Ç³£ÆÕ±é£¬ÎÒÃÇÓÐʱºòÏëÔÚÍøÂçÉÏ´«µÝ¸÷ÖÖ¶ÔÏ󣬵«ÊDz»ÐÒµÄÊÇ£¬ÏñCORBA,RMIÕâЩЭÒéʹÓÃÆðÀ´·Ç³£·ÑÁ¦£¬ÐèÒªÌØÊâ¹æ¶¨µÄ±àÂ룬Òì³£´¦Àí£¬¶øÇÒ»¹ÒªÔÚÈκε÷ÓÃǰ¶¨Òå½Ó¿Ú¡£

Ruby¶Ô´ËÓÐÒ»¸ö¼òµ¥µÄ½â¾ö·½·¨£¬Ïû³ýÁËÉÏÃæ·½·¨µÄ·±ËöÖ®´¦¡£·Ö²¼Ê½Ruby£¨Ò²½Ðdrb»òÕßdruby£©ÊÇÒ»¸ö¶ÀÁ¢µÄ¿â£¬ÍêÈ«ÓÉRubyд³É£¬Í¨¹ýÕâ¸ö¿â£¬Äã¿ÉÒÔͨ¹ýTCPÔÚ²»Í¬µÄRuby½ø³ÌÖд«Ë͸÷ÖÖ¶ÔÏó£¨Ruby¶ÔÏ󣩣¬¶øÇÒÖ»ÐèÒªºÜÉٵIJ½Öè¡£

Çåµ¥8ÏÔʾÁËÕâÑùµÄÒ»¸öÀý×Ó£¬Õâ¸ö·þÎñ¶Ë¹²ÏíÁËÒ»¸ö¶ÔÏó£¬Í¨¹ýÕâ¸ö¶ÔÏó£¬Äã¿ÉÒԵõ½·þÎñÆ÷µÄʱ¼ä¡£µÚ3Ðе½µÚ7Ðж¨ÒåÁËÕâ¸öÈ¡µÃ±¾µØÊ±¼äÒª±»¹²ÏíµÄ¶ÔÏ󣬵Ú9Ðн«Õâ¸ö¶ÔÏó°ó¶¨µ½Ò»¸ödrb·þÎñÆ÷£¨±¾ÀýÖж˿ÚΪ2222£©£¬ÒòΪ·þÎñÆ÷³ÌÐòÔÚÒ»¸ö¶ÀÁ¢µÄỊ̈߳¬ËùÒÔµÚ10ÐÐÈ·±£Ö÷³ÌÐò»áÔÚÕâ¸öÏ߳̽áÊøºó²ÅÄÜÍ˳ö¡£

¡¡

Çåµ¥8: A simple distributed Ruby server

 1   require 'drb'
 2
 3   class Info
 4     def get_time
 5       "It is now #{Time.now}"
 6     end
 7   end
 8
 9   DRb.start_service("druby://your.host.name:2222", Info.new)
10   DRb.thread.join

Çåµ¥9ÊÇÒ»¸ö¿Í»§¶Ë³ÌÐò£¬Ò²·Ç³£¼òµ¥£¬µÚ4ÐеÄDRbObject µ÷ÓúÍÔ¶³Ì·þÎñÆ÷½¨Á¢ÁËÒ»¸öÁ¬½Ó£¬·µ»ØÁËÔ¶³Ì¶ÔÏóµÄÒ»¸ö´úÀí£¬È»ºó£¬Äã¾Í¿ÉÒÔÏñµ÷Óñ¾µØ¶ÔÏóÒ»Ñùµ÷ÓÃÔ¶³Ì¶ÔÏóµÄ·½·¨ÁË¡£

¡¡

Çåµ¥9: A simple distributed Ruby client

 1   require 'drb'
 2
 3   DRb.start_service
 4   info = DRbObject.new(nil, "druby://your.host.name:2222")
 5
 6   3.times do 
 7     puts info.get_time
 8     sleep 2
 9   end
 

¡¡

ÏÂÃæÎÒÃÇÀ´¿´Ò»ÏÂÁíÒ»¸öºÜÓÐÒâ˼µÄ¶«Î÷tuplesapces£¬ËüÊÇDavid GelernterÔÚLindaϵͳÖÐÊ×ÏÈÌá³öÀ´µÄ£¬tuplespacesÏñÒ»¸ö¹²ÏíµÄbbsϵͳ£¬³ÌÐò¿ÉÒÔÏòËüÌùÏûÏ¢£¬»òÕß´ÓËüÈ¡µÃÏûÏ¢£¬ÕâÀïËù˵µÄÏûÏ¢¶¼ÊÇһЩֵ×é³ÉµÄÊý×é¡£out·½·¨ÓÃÀ´ÏòtuplespaceдÏûÏ¢£¬ËùÒÔ£¬ÏÂÃæµÄ´úÂë´úÂë´´½¨ÁËÒ»¸öº¬ÓÐ4ÌõÄÚÈݵÄtuplespace£º

¡¡

require 'tuplespace'
ts = TupleSpace.new  
ts.out  [ "dave", "car", "blazer" ]
ts.out  [ "dave", "computer", "dell" ]
ts.out  [ "andy", "car", "explorer" ]
ts.out  [ "andy", "os", "linux" ]

ʹtuplespacesÓÐȤµÄÊÇÄãÒªÏëÈ¡µÃËüÀïÃæµÄÄÚÈÝ£¬Äã²»ÊǸù¾ÝµØÖ·À´È¡£¬¶øÊǸù¾ÝÄÚÈݱ¾Éí£¨Í¨¹ýÆ¥Å䣩À´È¡¡£RubyʵÏÖµÄtuplespace¸ü¼ÓÇ¿´ó£¬È¡µÃÏûÏ¢µÄÆ¥Åäģʽ¿ÉÒÔÊÇÖµ£¬¶ÔÏóµÄÀ࣬ÕýÔò±í´ïʽ£¬rangeµÈµÈ¡£nil±íʾÄã²»¹ØÐÄËüµÄÄÚÈÝÊÇʲô£¬¼´±íʾÈκζ«Î÷¶¼Æ¥Åänil¡£ÒªÏëÈ¡µÃÏûÏ¢ÄÚÈÝ¿ÉÒÔÓÃin·½·¨£¬Èç¹ûin·½·¨ÖÐÖ¸¶¨µÄģʽÄÜÔÚtuplespaceÖÐÕÒµ½Æ¥ÅäµÄÏÄÇôÕâ¸öÆ¥ÅäµÄÏ±»´ÓtuplespaceÖÐɾ³ý£¬²¢ÇÒ½«ÕâÏî·µ»Ø¸øµ÷ÓÃÕߣ»·ñÔòµÄ»°£¬in½«µÈ´ýÖ±µ½ÓÐÆ¥ÅäµÄÏîÄ¿³öÏÖ¡£Èç¹ûÓжà¸ö¼Ç¼ƥÅäinÖÐÖ¸¶¨µÄģʽ£¬ÄÇô½«»áËæ»úµÄ·µ»ØÆäÖеÄÒ»¸ö¼Ç¼¡£

¼ÌÐøÇ°ÃæµÄÀý×Ó£¬ÏÂÃæµÄÀý×Ó´ÓtuplespaceÖжÁÈ¡ÒѾ­´æÈëµÄ¼Ç¼£¬×¢Òâ×îºóÒ»¸öÓï¾ä£¬ËüʹÓÃÁËÕýÔò±í´ïʽ×÷ΪƥÅäµÄģʽ¡£

# read one of Dave's possessions
res1 = ts.in ["dave", nil, nil]
# someone owning a car
res2 = ts.in [nil, "car", nil]
# a possession containing the "x" or "z"
res3 = ts.in [nil, nil, /[xz]/]

´ÓÕâ¸ö¼òµ¥µÄÀý×Ó¿ªÊ¼£¬ÄãÄÜÇáËɵرàд³ö¸´ÔÓ£¬Ð­×÷£¬²¢ÐеÄϵͳ¡£

±ÈÈ磬Äã¿ÉÒÔÓÃtuplespace½â¾ö¸´ÔÓµØAIÎÊÌâ¡£Ò»¸ö½ø³Ì¿ÉÒÔͨ¹ý½«Ò»×éÊý¾Ý×éºÏÆðÀ´·Åµ½tuplespaceÖÐÀ´²úÉúÒ»¸öÎÊÌ⣬ÆäËû½ø³ÌÔòͨ¹ýÆ¥Å䵨·½Ê½´ÓtuplespaceÖжÁÈ¡ËüÄܽâ¾öµØÎÊÌ⣻һ¸ö½ø³ÌµÃµ½Ò»¸ö´íÎóµØÊ±ºò£¬ËüÒ²¿ÉÄܰÑÕâ¸öÎÊÌâϸ·ÖΪ¸üСµÄÎÊÌâ £¬È»ºó½«ËüÃǷŵ½tuplespaceÀïÃæ¡£ÆäËüµÄ½ø³ÌÓÖÈ¡µÃÕâ¸öÎÊÌ⣬Ȼºó½â¾öËüÃÇ»òÕß¼ÌÐø·Ö½âÕâЩÎÊÌâ¡£

Õâ¸ö¹ý³Ì½«¼ÌÐø£¬Ö±µ½ËùÓеÄÎÊÌâ¶¼µÃµ½½â¾ö¡£

ΪÁËÍê³ÉÕâÆªÎÄÕ£¬ÎÒÃǽ«Ê¹ÓÃdrbºÍtuplespace±àдһ¸ö¼òµ¥µÄP2PµÄÁÄÌì³ÌÐò£¬Õâ¸öϵͳ½«ÓÉÈý¸öÔªËØ×é³ÉµÄÏûÏ¢´æ·ÅÔÚtuplespaceÖУ¬¼´ÏûÏ¢µÄ·¢ËÍÕߣ¬½ÓÊÕÕߣ¬ºÍÏûÏ¢ÄÚÈÝ¡£

¿Í»§¶ËµÄ³ÌÐòÔÚÇåµ¥10ÖУ¬¿Í»§¶ËÓÉÁ½¸öÏß³ÌÒ»ÆðÔËÐУ¬·¢ËÍÏß³ÌÊÇÖ÷Ị̈߳¬ÔÚËüÀïÃæÏÔʾµÄ´´½¨Á˽ÓÊÕÏ̡߳£·¢ËÍÏ̴߳ӵÚ16Ðе½22ÐУ¬Ëü´ÓÓû§µÄ¿ØÖÆÌ¨¶ÁÈ¡×Ö·û´®£¬¸ñʽÈçÏ£º

to:  message text

toÊǽÓÊÕÕßÐÕÃû£¬µÚ17Ðн«ÉÏÃæµÄÊäÈë·Ö³ÉÁ½²¿·Ö£¬Ç°ÃæµÄÊÇÐÕÃû£¬Ê£ÏµÄÊÇÏûÏ¢ÄÚÈÝ¡£È»ºó£¬µÚ19Ðн«Õâ¸öÏûÏ¢×é³ÉÒ»¸öÊý×éдµ½tuplespaceÀïÃæ¡£

¡¡

Çåµ¥10: A chat client based on tuplespaces

 1   require 'drb'
 2   require 'tuplespace'
 3
 4   DRb.start_service
 5   ts = DRbObject.new(nil, / "druby://server.host:12321")
 6
 7   my_name = ARGV[0]
 8
 9   Thread.new do
10     loop do
11       from, unused, line = ts.in / [ nil, my_name, nil ]
12       puts "#{from} says: #{line}"
13     end
14   end
15
16   while line = gets
17     to, text = line.split(/:/, 2)
18     if text
19       ts.out [ my_name, to, text ]
20     else
21       puts '** use   "to: message"'
22     end
23   end

½ÓÊÕÏß³ÌÒ²ºÜ¼òµ¥£¬µÚ9Ðе½14ÐÐÔËÐÐÒ»¸ö¼òµ¥µÄÑ­»·£¬´ÓtuplespaceÖжÁÈ¡Êý¾Ý£¬Æ¥ÅäÌõ¼þÊÇÏûÏ¢½ÓÊÕÕßÊÇÎÒÃÇ×Ô¼ºµÄÃû×Ö£¬È»ºó½«½á¹û´òÓ¡ÔÚ¿ØÖÆÌ¨ÉÏ¡£

¡¡

TuplespacesÐèÒªÒ»¸ö·þÎñÆ÷´æ·Åtuples£¬ÔÚRubyÖÐÓÃdrb·þÎñÆ÷À´´æ·Åtuplespace¶ÔÏ󣬿ÉÒÔÓÃÏÂÃæ´úÂëʵÏÖ£º

require 'drb'
require 'tuplespace'

DRb.start_service("druby://server.host:12321", / 
  TupleSpace.new)
DRb.thread.join

Ê×ÏÈÔËÐзþÎñ¶Ë³ÌÐò£¬È»ºóÔËÐпͻ§¶Ë£¬²¢ÇÒÔÚ¿Í»§¶Ë³ÌÐòÖ¸¶¨ÄãÏëÓõÄÃû×Ö×÷Ϊ²ÎÊý¡£

Èç¹ûÄãÔËÐÐËüÄã»á·¢ÏÖ£¬Èç¹ûÄã²»ÔÚÏߣ¬·þÎñÆ÷¶Ë»á°Ñ¸øÄãµÄÏûÏ¢±£´æÔÚ·þÎñÆ÷ÉÏ¡£ÎÒÃǵÄÕâ¸öÓ¦ÓóÌÐò²»¶÷ÄǸöÈ¡´úYahoo IM£¬Jabber»òÕßIRCµÈ£¬µ«Õâ¶Î´úÂëÈ´·Ç³£ÓÐÓá£

×îлظ´