-
-
Save ytnk531/b6da8b93f525ccfdb150f160717fa786 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'socket' | |
require 'nio' | |
module FiberServer | |
#:nodec: | |
class Server | |
def initialize | |
@selector = NIO::Selector.new | |
@fibers = {} | |
end | |
def run | |
@srv = TCPServer.new 13_000 | |
@selector.register @srv, :r | |
loop do | |
@selector.select do |m| | |
case m.io | |
when @srv | |
accept m.io | |
else | |
communicate m.io | |
end | |
end | |
end | |
end | |
def accept(io) | |
socket = io.accept_nonblock | |
@fibers[socket] = communication_fiber | |
@selector.register socket, :r | |
end | |
def communicate(io) | |
f = @fibers[io] | |
@selector.deregister io | |
f.resume io | |
end | |
def communication_fiber | |
Fiber.new do |io| | |
message = io.read_nonblock 5000 | |
@selector.register io, :w | |
Fiber.yield | |
io.write_nonblock response(message) | |
io.close | |
@fibers.delete io | |
end | |
end | |
def response(message) | |
<<~RESP | |
HTTP/1.1 200 OK | |
<html> | |
<body> | |
<h1>こんにちは 世界</h1> | |
<p>HTTPを使って通信するサーバーを作ったよ。</p> | |
<p>#{message}</p> | |
</body> | |
</html> | |
RESP | |
end | |
end | |
end | |
s = FiberServer::Server.new | |
s.run |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment