システム

システム図

Rinda を介して、分散強調するシステムにする。

各部がシンプルになって良いんじゃないかと思って。

とりあえず、クライアントとのソケットを保持する部分を作った。

require 'rinda/tuplespace'
require 'json'

tuple_space = Rinda::TupleSpace.new

t = Thread.fork do
  DRb.start_service( "druby://localhost:45678", tuple_space )
  puts DRb.uri
  DRb.thread.join
end

tcp_server = TCPServer.new( port = 12345 )

loop do
  Thread.fork( tcp_server.accept ) do |sock|
    me = sock.gets.chomp
    # relay (send part)
    Thread.fork do
      loop do
        type, target, param = tuple_space.take( [ nil, me, Hash ] )
        param[ "type" ] = type
        sock.puts param.to_json
      end
    end
    
    # recieve part
    while line = sock.gets
      begin
        type, target, param = JSON.parse( line )
        param[ 'from' ] = me
        tuple_space.write( [ type, target, param ], 120 )
      rescue => e
        warn "wrong format, #{e.message}"
      end
    end
    
    warn "#{me} disconnected"
  end
end

めっちゃシンプル。