Skip to content

Instantly share code, notes, and snippets.

@jjyr
Created January 6, 2018 09:19
Show Gist options
  • Save jjyr/71e17924c7906e8dfc9d6000ef421ab9 to your computer and use it in GitHub Desktop.
Save jjyr/71e17924c7906e8dfc9d6000ef421ab9 to your computer and use it in GitHub Desktop.
NIO4r ruby backend behaviour
#!/usr/bin/env ruby
# frozen_string_literal: true
$LOAD_PATH.push File.expand_path("../../lib", __FILE__)
require "nio"
require "socket"
# Echo server example written with nio4r
class EchoServer
def initialize(host, port)
backend = ENV["NIO4R_PURE"] ? :ruby : nil
@selector = NIO::Selector.new backend
puts "use backend #{@selector.backend}"
puts "Listening on #{host}:#{port}"
@server = TCPServer.new(host, port)
monitor = @selector.register(@server, :r)
monitor.value = proc { accept }
@monitor = monitor
end
def run
loop do
# printing server readiness
puts "server readiness is #{ @monitor.readiness}"
@selector.select { |monitor| monitor.value.call(monitor) }
end
end
def accept
socket = @server.accept
_, port, host = socket.peeraddr
puts "*** #{host}:#{port} connected"
monitor = @selector.register(socket, :r)
monitor.value = proc { read(socket) }
end
def read(socket)
data = socket.read_nonblock(4096)
socket.write_nonblock(data)
rescue EOFError
_, port, host = socket.peeraddr
puts "*** #{host}:#{port} disconnected"
@selector.deregister(socket)
socket.close
end
end
EchoServer.new("localhost", 1234).run if $PROGRAM_NAME == __FILE__
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment