Какой самый эффективный способ чтения из TCPServer? - PullRequest
0 голосов
/ 21 сентября 2009

Я создаю сервер ruby, который подключается к TCP-клиенту. Мой сервер использует TCPServer, и я пытаюсь использовать TCPServer :: recv (), но он не ожидает данных, поэтому просто продолжает работать в тесном цикле, пока данные не будут получены.

Какой самый эффективный способ обработки прерывистых данных? Я не могу изменить отправляемые данные, поскольку пытаюсь эмулировать другой сервер. Какой оператор чтения из 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")

Спасибо за ваше время.

Ответы [ 2 ]

0 голосов
/ 22 сентября 2009

вы уверены, что recv не возвращает "" - значит сокет закрыт? Если нет, то, возможно, ваши сокеты как-то настроены как не блокирующие?

EventMachine действительно намного быстрее, чем использование потоков для программирования сокетов :) GL. -r

0 голосов
/ 22 сентября 2009

Исходя из вопросов, которые вы задавали, я думаю, вы должны попробовать такую ​​среду, как EventMachine, и написать сервер, который реализует то, что вы хотите, вместо того, чтобы пытаться возиться с написанием серверной оболочки.

При этом наиболее эффективным способом чтения из сокета является использование правильного вызова select и опрос всех открытых соединений. Хотя это довольно академично для тех, кто раньше разрабатывал клиент-серверные приложения, это неприятно, потому что есть много вещей, которые вы легко можете ошибиться. Например. обработка нескольких соединений может привести к всевозможным неприятным ситуациям, если вы не особенно осторожны, чтобы избежать блокировки вызовов.

Среда EventMachine позволяет легко разрабатывать серверы типа запрос / ответ, потому что вы всегда можете начать с шаблона и работать с него, например, встроенный EventMachine :: Protocols :: LineAndTextProtocol один служит отличной основой. для большинства.

...