Какой наиболее эффективный способ чтения с TCPServer?
Вопрос
Я создаю сервер ruby, который подключается к TCP-клиенту.Мой сервер использует TCPServer, и я пытаюсь использовать TCPServer::recv(), но он не ожидает получения данных, поэтому просто продолжает в замкнутом цикле, пока данные не будут получены.
Каков наиболее эффективный способ обработки прерывистых данных?Я не могу изменить отправляемые данные, так как пытаюсь эмулировать другой сервер.Какой оператор read like из TCPServer / TCPSocket будет ожидать отправки данных?
require "socket"
dts = TCPServer.new('localhost', 20000)
s = dts.accept
print(s, " is accepted\n")
loopCount = 0;
loop do
Thread.start(s) do
loopCount = loopCount + 1
lineRcvd = s.recv(1024)
if ( !lineRcvd.empty? )
puts("#{loopCount} Received: #{lineRcvd}")
s.write(Time.now)
end
end
end
s.close
print(s, " is gone\n")
Спасибо, что уделили мне время.
Решение
вы уверены, что recv не возвращает "" - это означает, что сокет закрыт?Если нет, то, возможно, ваши сокеты каким-то образом настроены на неблокирующее?
EventMachine действительно намного быстрее, чем использование потоков для программирования сокетов :) GL.-р
Другие советы
Основываясь на вопросах, которые вы задавали, я думаю, вам следует попробовать фреймворк, подобный EventMachine, и написать сервер, который реализует то, что вы хотите, вместо того, чтобы пытаться суетиться с написанием серверной оболочки.
При этом наиболее эффективный способ чтения из сокета - это использовать правильный вызов select и опросить все открытые соединения.Хотя это довольно академичная вещь для любого, кто раньше разрабатывал клиент-серверные приложения, это неприятно, потому что есть много вещей, которые вы можете легко ошибиться.Например.обработка нескольких подключений может привести ко всевозможным неприятным ситуациям, если вы не будете особенно осторожны, чтобы избежать блокирования вызовов.
Платформа EventMachine упрощает разработку серверов типа запросов / ответов, потому что вы всегда можете начать с шаблона и работать оттуда, например, встроенный EventMachine::Protocols::LineAndTextProtocol one является отличной основой для большинства.