昨日の続き。
昨日の続きです。
とりあえずlamportのアルゴリズムを実装してみました。
P2Pで通信っぽいことをします。
でも何もできません。
アプリはこれから載せるはず。
require 'thread'
require 'socket'$timerlock=Mutex.new
$globaltime = 0
$nodelist =
{"hoge" =>{:ipaddr =>"192.168.1.12",:port =>"10000"},
"foo" =>{:ipaddr =>"192.168.1.12",:port =>"10001"},
"bar" =>{:ipaddr =>"192.168.1.12",:port =>"10002"},
"baz" =>{:ipaddr =>"192.168.1.12",:port =>"10003"}}
Thread.start do
while true
$timerlock.synchronize do
$globaltime+=1
end
sleep(0.001)
end
end
class Server
def initialize(id)
@id = id
@port = $nodelist[id][:port]
puts "server#{@id} is started at port #{@port}"
end
def parseMessage(mes)
lines=mes.split(/\n/)
at=lines[0].delete("at:").to_i
$timerlock.synchronize do
if (at >= $globaltime)
$globaltime = (at+1)
end
arrive=$globaltime
puts "send:#{at} recv:#{arrive}"
end
end
def recvMessage(sock)
message=""
while sock.gets
message+=$_
end
parseMessage(message)
end
def serverMain
while true
Thread.start(@gs.accept) do |s|
print(s, " is accepted\n")
recvMessage(s)
print(s, " is gone\n")
s.close
end
end
end
def sendMessage(id,message)
if $nodelist[id]
begin
sock = TCPSocket.open($nodelist[id][:ipaddr],$nodelist[id][:port])
rescue Errno::ECONNREFUSED # Connection refused
return
end
sock.write("at:#{$globaltime}\n")
sock.write("from:test\n")
sock.write("to:test\n")
sock.write("op:0\n")
sock.write(message)
sock.close
end
end
def sendHello(id)
if $nodelist[id]
begin
sock = TCPSocket.open($nodelist[id][:ipaddr],$nodelist[id][:port])
rescue Errno::ECONNREFUSED # Connection refused
return
end
sock.write("at:#{$globaltime}\n")
sock.write("from:test\n")
sock.write("to:test\n")
sock.write("op:0\n")
sock.write("hello\n")
sock.close
end
end
def run
@gs = TCPServer.open(@port)
addr = @gs.addr
addr.shift
@server = Thread.start do
serverMain
end
while a=$stdin.readline
$nodelist.each do |i|
next if i[0] == @id
sendHello(i[0])
end
end
end
end
serv=Server.new(ARGV[0])
serv.run