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

Returns a new instance of Connection.



85
86
87
88
89
90
91
92
# File 'lib/net/reactor.rb', line 85

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.



137
138
139
# File 'lib/net/reactor.rb', line 137

def socket
  @socket
end

Instance Method Details

#disconnectedObject

delegate



133
134
135
# File 'lib/net/reactor.rb', line 133

def disconnected
    @handler.disconnected 'socket closed'
end

#handleIOEvent(io, event) ⇒ Object



94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/net/reactor.rb', line 94

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



120
121
122
123
124
125
126
127
128
129
130
# File 'lib/net/reactor.rb', line 120

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



114
115
116
117
118
# File 'lib/net/reactor.rb', line 114

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



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

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