Class: Net::Reactor::Connection

Inherits:
Object
  • Object
show all
Defined in:
lib/net/reactor.rb

Constant Summary collapse

MTU =
4096
CR =
"\015"
LF =
"\012"
EOL =
CR + LF

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(socket, handler, reactor) ⇒ Connection



79
80
81
82
83
84
85
86
# File 'lib/net/reactor.rb', line 79

def initialize(socket, handler, reactor)
    @handler = handler.new self
    @socket = socket
    @reactor = reactor
    
    @write_buffer = ''
    @read_buffer = ''
end

Instance Attribute Details

#socketObject (readonly)

Returns the value of attribute socket.



131
132
133
# File 'lib/net/reactor.rb', line 131

def socket
  @socket
end

Instance Method Details

#disconnectedObject

delegate



127
128
129
# File 'lib/net/reactor.rb', line 127

def disconnected
    @handler.disconnected 'socket closed'
end

#handleIOEvent(io, event) ⇒ Object



88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/net/reactor.rb', line 88

def handleIOEvent(io, event)
    case event
    when :error
        @handler.disconnected 'socket failed'
    when :read
        begin
            handleRead
        rescue EOFError
            @handler.disconnected 'connection closed by remote host'
        end
    when :write
        handleWrite
    end
end

#handleReadObject



114
115
116
117
118
119
120
121
122
123
124
# File 'lib/net/reactor.rb', line 114

def handleRead
    lines = []
    @read_buffer << @socket.sysread(MTU)
    if @read_buffer.index EOL
        lines = @read_buffer.split EOL
    else
        lines = @read_buffer
    end
    @read_buffer[0, @read_buffer.length] = ''
    @handler.readEvent lines
end

#handleWriteObject



108
109
110
111
112
# File 'lib/net/reactor.rb', line 108

def handleWrite
    bytes = @socket.syswrite(@write_buffer)
    @write_buffer[ 0, bytes ] = '' if bytes.nonzero?
    @reactor.disableEvents(@socket, :write) if @write_buffer.length.zero?
end

#write(msg) ⇒ Object



103
104
105
106
# File 'lib/net/reactor.rb', line 103

def write msg
    @write_buffer << msg
    @reactor.enableEvents(@socket, :write)
end