Какой наиболее эффективный способ чтения с TCPServer?

StackOverflow https://stackoverflow.com/questions/1456520

  •  12-09-2019
  •  | 
  •  

Вопрос

Я создаю сервер 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 является отличной основой для большинства.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top