Я реализовал очень простой вид сервера в Ruby, используя TCPServer
. У меня есть Server
класс с serve
методом:Ruby TCPServer не работает иногда
def serve
# Do the actual serving in a child process
@pid = fork do
# Trap signal sent by #stop or by pressing ^C
Signal.trap('INT') { exit }
# Create a new server on port 2835 (1 ounce = 28.35 grams)
server = TCPServer.new('localhost', 2835)
@logger.info 'Listening on http://localhost:2835...'
loop do
socket = server.accept
request_line = socket.gets
@logger.info "* #{request_line}"
socket.print "message"
socket.close
end
end
end
и stop
метод:
def stop
@logger.info 'Shutting down'
Process.kill('INT', @pid)
Process.wait
@pid = nil
end
Я бегу мой сервер из командной строки, используя:
if __FILE__ == $0
server = Server.new
server.logger = Logger.new(STDOUT)
server.logger.formatter = proc { |severity, datetime, progname, msg| "#{msg}\n" }
begin
server.serve
Process.wait
rescue Interrupt
server.stop
end
end
Проблема заключается в том, что , иногда, когда я делаю ruby server.rb
с моего терминала, сервер запускается, но когда я пытаюсь сделать запрос на localhost:2835
, он терпит неудачу. Только после нескольких запросов он начинает обслуживать некоторые страницы. В других случаях мне нужно снова остановить/запустить сервер, чтобы он правильно обслуживал страницы. Почему это происходит? Я делаю что-то неправильно? Я нахожу это очень странным ...
То же самое относится к моим спецификациям: у меня есть определенные спецификации и некоторые спецификации Capybara. Перед каждым тестом я создаю сервер и запускаю его, и после каждого теста я останавливаю сервер. И проблема сохраняется: тесты иногда проходят, иногда сбой, потому что запрошенная страница не найдена.
Есть ли что-то рыбное с моим fork
ing?
бы признателен любой ответ, потому что у меня нет больше места, чтобы посмотреть ...
Ваш код работает надежно, когда я запускаю его. Как вы делаете запросы на свой сервер? Я использую 'nc'. – Adrian
Классический способ: открытие браузера на 'localhost: 2835'. И в тестах, «классический» способ Capybara, с «посещением» localhost: 2833''. – linkyndy
Это твоя проблема. Если вы хотите посетить 'localhost: 2835' в своем браузере, вам нужно реализовать HTTP-сервер. Код, который вы отправили, не является HTTP-сервером. – Adrian