Changeset 196

Show
Ignore:
Timestamp:
06/03/06 20:06:42 (2 years ago)
Author:
blackhedd
Message:

TCP clients

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • experiments/NewMachine/lib/machine/eio.rb

    r186 r196  
    2626    def listen_tcp *args, &block 
    2727      EventableTcpServer.listen_tcp *args, &block 
     28    end 
     29    def connect_tcp *args, &block 
     30      EventableTcpClient.connect_tcp *args, &block 
    2831    end 
    2932 
     
    9598  def_delegator :@eventable_io, :select_for_writing? 
    9699  def_delegator :@eventable_io, :eventable_read 
     100  def_delegator :@eventable_io, :eventable_write 
    97101end 
    98102 
     
    308312 
    309313 
    310  
    311  
     314##################################### 
     315 
     316module Machine 
     317  CompletedConnection = Struct.new :nothing 
     318 
     319  class EventableTcpClient < EventableStream 
     320 
     321 
     322    def self.connect_tcp host, port, dispatcher=EventDispatcher.new 
     323      sd = Socket.new( Socket::AF_INET, Socket::SOCK_STREAM, 0 ) 
     324      begin 
     325        sd.connect_nonblock( Socket.pack_sockaddr_in( port, host )) 
     326      rescue Errno::EINPROGRESS 
     327      end 
     328      EventableTcpClient.new sd, dispatcher 
     329    end 
     330 
     331 
     332    # We assume we're getting a TCP socket on which 
     333    # connect_nonblock has been called. 
     334    # DO NOT attempt to read the socket. 
     335    # When it selects writable, the connect has completed. 
     336    # 
     337    def initialize io, dispatcher=EventDispatcher.new 
     338      super 
     339      @pending = true 
     340    end 
     341 
     342    def select_for_writing? 
     343      @pending ? true : super 
     344    end 
     345 
     346    def select_for_reading? 
     347      @pending ? false : super 
     348    end 
     349 
     350    def eventable_write 
     351      if @pending 
     352        @pending = false 
     353        @dispatcher.send_event(CompletedConnection.new) 
     354      else 
     355        super 
     356      end 
     357    end 
     358 
     359  end 
     360end 
     361 
     362 
     363 
  • experiments/NewMachine/lib/machine/protocol.rb

    r183 r196  
    1414      super 
    1515      add_handler( StreamData ) {|sd| received_data sd.data } 
     16      add_handler( CompletedConnection ) {|evt| completed_connection evt} 
    1617    end 
    1718 
     
    2021    end 
    2122 
    22 =begin 
    23     def line_emitter_on 
    24       @processing_mode = :emit_lines 
    25       @linebuffer = "" 
     23    # Null placeholder, intended to be subclassed 
     24    # The passed-in event is a null at the moment, 
     25    # eventually could pass in a sockname or something. 
     26    def completed_connection evt 
    2627    end 
    27  
    28     def line_emitter_off 
    29       @processing_mode = :raw 
    30     end 
    31  
    32     def handle_stream_data evt 
    33       case @processing_mode 
    34       when :emit_lines 
    35         evt.data.each {|chunk| 
    36           @linebuffer << chunk 
    37           while @linebuffer =~ /\r*\n/m 
    38             line = StreamDataLine.new 
    39             line.line = $` 
    40             send_event line 
    41             @linebuffer = $' 
    42           end 
    43         } 
    44       end 
    45     end 
    46 =end 
    4728 
    4829  end