Advertisement
robert_

server.rb

Mar 30th, 2012
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 2.76 KB | None | 0 0
  1. #!/usr/bin/env ruby
  2. require 'socket'
  3. require 'thread'
  4.  
  5. require 'csv'
  6. require 'base64'
  7.  
  8. class PreThreadedTcpServer
  9.    def initialize port, host=nil, *args
  10.  
  11.       unless host.nil?
  12.          @server = TCPServer.new host, port
  13.       else
  14.          @server = TCPServer.new port
  15.       end
  16.  
  17.       @server_t = nil
  18.       @clients = []
  19.    end
  20.  
  21.    @timeout = 2
  22.  
  23.    def start
  24.       false if not @server_t.nil?
  25.  
  26.       # Server thread. We can only run one.
  27.       @server_t = Thread.new do
  28.  
  29.          puts "Server started."
  30.  
  31.          # Main accept loop
  32.          loop do
  33.             list_of = [@server]+@clients
  34.             puts "LOOP."
  35.  
  36.             fd_list = select( list_of, nil, @clients, @timeout ) or
  37.                next
  38.  
  39.             fd_list[2].each{ |fd|
  40.                fd.close
  41.                @clients.delete fd
  42.  
  43.                puts "FD[#{fd}] has disconnected."
  44.             }
  45.  
  46.             fd_list[0].each { |fd|
  47.                unless fd == @server then
  48.                   unless fd.eof?
  49.                      worker fd
  50.                   else
  51.                      @verbose and
  52.                         puts "server: client closed #{fd.peeraddr.join(':')}"
  53.                      @verbose and
  54.                         puts "server: client closed #{fd.peeraddr.join(':')}"
  55.  
  56.                      fd.close
  57.                   end
  58.                else
  59.                   client = fd.accept or
  60.                      raise "Error while accept()'ing client socket."
  61.  
  62.                   puts "New client connection from #{fd.peeraddr.join(':')}"
  63.  
  64.                   @clients << client
  65.                   pollconn = select @clients, nil, nil
  66.  
  67.                   pollconn.each { |poll_fd|
  68.                      fd_list[0] << poll_fd if not fd_list[0].include? poll_fd
  69.                   }
  70.                end
  71.             }
  72.  
  73.          end
  74.       end
  75.       @server_t.run
  76.  
  77.       true
  78.    end
  79.  
  80.    # Implemented in actual server classes
  81.    def worker
  82.       raise "Not Implemented in #{self.Class}"
  83.    end
  84. end
  85.  
  86. class TimeServer < PreThreadedTcpServer
  87.    def initialize(port=10001, *args)
  88.       super(port, *args)
  89.    end
  90.  
  91.    def worker io
  92.       csvdata = "group,member_id,email\n"
  93.       csvdata << io.gets
  94.  
  95.       CSV.parse(csvdata, :return_headers => false, :headers => :first_row, :header_converters => :symbol) { |line|
  96.          record = {}
  97.          puts line[:member_id]
  98.  
  99.          @production[:enrollments][ :idnum => line[:member_id] ].each { |key, value|
  100.             record[key.to_sym] = value
  101.          }
  102.       }
  103.      
  104.       puts "[#{Time.now}]  Attaching PDF to output stream..."
  105.       io.puts "DATA #{Base64.encode64(result[:data])}"
  106.  
  107.       io.puts "DATA OK"
  108.    end
  109. end
  110.  
  111. port = 10001
  112. host = '0.0.0.0'
  113.  
  114. service = TimeServer.new port, host
  115. service.start
  116.  
  117. sleep
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement