-
-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathecho_server_with_raw_socket.rb
More file actions
48 lines (41 loc) · 1.32 KB
/
echo_server_with_raw_socket.rb
File metadata and controls
48 lines (41 loc) · 1.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# Example from https://github.com/socketry/nio4r/blob/master/examples/echo_server.rb
# rewrite it in lightio for demonstrate
# this example demonstrate LightIO low-level API
# how to use ruby 'raw'(unpatched) 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_readable
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_readable
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