Skip to content

Instantly share code, notes, and snippets.

@besquared
Created April 9, 2009 19:26
Show Gist options
  • Select an option

  • Save besquared/92682 to your computer and use it in GitHub Desktop.

Select an option

Save besquared/92682 to your computer and use it in GitHub Desktop.
require 'rubygems'
require 'socket'
require 'thread'
require 'uuidtools'
class Peer
attr_accessor :host, :port
def initialize(host, port)
@host = host
@port = port
end
def members
@members ||= []
end
def address
@address ||= UUID.random_create
end
def mutex
@mutex ||= Mutex.new
end
def gossip!
@gossiper ||= Thread.new do
loop do
mutex.synchronize {
members.each do |socket|
socket.puts("WTF")
end
}
sleep 3
end
end
end
def listen!
puts "Listening on #{host}:#{port}"
@listener ||= Thread.new do
sock = TCPServer.open(host, port)
loop do
client = sock.accept
puts "Connected to new member on #{host}:#{port}"
mutex.synchronize {
members << client
}
end
end
end
def connect(host, port)
connection = TCPSocket.new(host, port)
Thread.new do
loop do
puts "#{host}:#{port} gossiped #{connection.gets} to me!"
end
end
end
def shutdown!
@gossiper.exit
@listener.exit
# go through each member and disconnect gracefully
end
def join
@gossiper.join
@listener.join
end
end
peer1 = Peer.new('localhost', 20000)
peer2 = Peer.new('localhost', 20001)
peer1.listen!
peer2.listen!
peer1.connect('localhost', 20001)
peer2.connect('localhost', 20000)
peer1.gossip!
peer2.gossip!
peer1.join
peer2.join
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment