class Rinda::RingServer

A RingServer allows a Rinda::TupleSpace to be located via UDP broadcasts. Service location uses the following steps:

  1. A RingServer begins listening on the broadcast UDP address.

  2. A RingFinger sends a UDP packet containing the DRb URI where it will listen for a reply.

  3. The RingServer receives the UDP packet and connects back to the provided DRb URI with the DRb service.

Public Class Methods

new(ts, port=Ring_PORT) click to toggle source

Advertises ts on the UDP broadcast address at port.

# File lib/rinda/ring.rb, line 32
def initialize(ts, port=Ring_PORT)
  @ts = ts
  @soc = UDPSocket.open
  @soc.bind('', port)
  @w_service = write_service
  @r_service = reply_service
end

Public Instance Methods

do_reply() click to toggle source

Pulls lookup tuples out of the TupleSpace and sends their DRb object the address of the local TupleSpace.

# File lib/rinda/ring.rb, line 82
def do_reply
  tuple = @ts.take([:lookup_ring, DRbObject])
  Thread.new { tuple[1].call(@ts) rescue nil}
rescue
end
do_write(msg) click to toggle source

Extracts the response URI from msg and adds it to TupleSpace where it will be picked up by reply_service for notification.

# File lib/rinda/ring.rb, line 57
def do_write(msg)
  Thread.new do
    begin
      tuple, sec = Marshal.load(msg)
      @ts.write(tuple, sec)
    rescue
    end
  end
end
reply_service() click to toggle source

Creates a thread that notifies waiting clients from the TupleSpace.

# File lib/rinda/ring.rb, line 70
def reply_service
  Thread.new do
    loop do
      do_reply
    end
  end
end
write_service() click to toggle source

Creates a thread that picks up UDP packets and passes them to #do_write for decoding.

# File lib/rinda/ring.rb, line 44
def write_service
  Thread.new do
    loop do
      msg = @soc.recv(1024)
      do_write(msg)
    end
  end
end