さくらんぼのlambda日記

lambdaちっくなことからゲーム開発までいろいろ書きます。

昨日の続き。

昨日の続きです。

とりあえず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