Sha256: 278a13ee8f3096e75a526193caa988b84e2cfefbe047b282d955c3b29e1292f8

Contents?: true

Size: 1.28 KB

Versions: 2

Compression:

Stored size: 1.28 KB

Contents

# Example from https://github.com/socketry/nio4r/blob/master/examples/echo_server.rb
# rewrite it in lightio for demonstrate
# this example demonstrate how to use ruby 'raw' socket with LightIO

require 'lightio'
require 'socket'

class EchoServer
  def initialize(host, port)
    @server = TCPServer.new(host, port)
  end

  def run
    # wait server until readable
    server_watcher = LightIO::Watchers::IO.new(@server, :r)
    while server_watcher.wait_read
      socket = @server.accept
      _, port, host = socket.peeraddr
      puts "accept connection from #{host}:#{port}"

      # LightIO::Beam is lightweight executor, provide thread-like interface
      # just start new beam for per socket
      LightIO::Beam.new(socket) do |socket|
        socket_watcher = LightIO::Watchers::IO.new(socket, :r)
        begin
          while socket_watcher.wait_read
            echo(socket)
          end
        rescue EOFError
          _, port, host = socket.peeraddr
          puts "*** #{host}:#{port} disconnected"
          # remove close socket watcher
          socket_watcher.close
          socket.close
        end
      end
    end
  end

  def echo(socket)
    data = socket.read_nonblock(4096)
    socket.write_nonblock(data)
  end
end


EchoServer.new('localhost', 3000).run if __FILE__ == $0

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
lightio-0.1.1 examples/echo_server_with_raw_socket.rb
lightio-0.1.0 examples/echo_server_with_raw_socket.rb