Хобрук: Ваш путь к мастерству в программировании

Как работает settimeout() luasocket?

У меня есть следующий код:

function Server:run()
    print("Running.")
    self.running = true
    while self.running do
        if self.client == nil then
            self.client = self.socket:accept()
            print("Client connected.")
            self.client:settimeout(10)
        end
        local line, err = self.client:receive()
        if err then
            print("Error: " .. err)
        elseif line == "quit" then
            print("Quitting.")
            self.client:close()
            self.running = false        
        else
            print("Received: " .. line)
        end
    end
    self:terminate()
end

Я ожидаю, что при вызове self.client:receive() сервер будет ждать 10 секунд или пока не получит сообщение, а затем продолжит свой путь.

Однако это не то поведение, которое я испытываю. Вместо этого сервер мгновенно генерирует ошибку тайм-аута независимо от того, какое значение тайм-аута установлено, и вообще не ждет сообщения от клиента.

Подозреваю, что я что-то неправильно понял. Любое понимание будет оценено. Спасибо.


Полный код здесь:

Сервер: http://pastie.org/9659701

основной: http://pastie.org/9659703


17.10.2014

Ответы:


1

У меня код работает как положено (Windows, LuaJIT 2.0.2, luasocket 3.0-rc1); Я протестировал следующий автономный скрипт:

local socket = require "socket"
local server = assert(socket.bind("*", 3333))
local client = server:accept()
print("accepted connection; waiting for data...")
client:settimeout(10)
local start = os.time()
local line, err, partial = client:receive("*l")
if line then
  print(("received '%s'; echoing back..."):format(line))
  client:send(line.."\n")
else
  print(("received error '%s' after %.2f seconds."):format(err, os.time()-start))
end
client:close()

Вы можете запустить telnet localhost 3333 и должны увидеть "принятое соединение; ожидание данных..."; если я ничего не отправлю, я получаю «получено сообщение об ошибке« тайм-аут »через 10,00 секунд», чего я и ожидал.

Я бы проверил, есть ли логическая ошибка, и self.client никогда не бывает nil в вашем случае, и вы не вызываете settimeout. Если это все еще не помогает, сделайте отдельный пример, который мы можем запустить с помощью love2d (например, я не вижу, где вы вызываете bind).

17.10.2014
Новые материалы

Создание успешной организации по науке о данных
"Рабочие часы" Создание успешной организации по науке о данных Как создать эффективную группу по анализу данных! Введение Это обзорная статья о том, как создать эффективную группу по..

Технологии и проблемы будущей работы
Изучение преимуществ и недостатков технологий в образовании В быстро меняющемся мире технологии являются решающим фактором в формировании будущего работы. Многие отрасли уже были..

Игорь Минар из Google приедет на #ReactiveConf2017
Мы рады сообщить еще одну замечательную новость: один из самых востребованных спикеров приезжает в Братиславу на ReactiveConf 2017 ! Возможно, нет двух других кланов разработчиков с более..

Я собираюсь научить вас Python шаг за шагом
Привет, уважаемый энтузиаст Python! 👋 Готовы погрузиться в мир Python? Сегодня я приготовил для вас кое-что интересное, что сделает ваше путешествие более приятным, чем шарик мороженого в..

Альтернатива шаблону исходящих сообщений для архитектуры микросервисов
Познакомьтесь с двухэтапным сообщением В этой статье предлагается альтернативный шаблон для папки Исходящие : двухэтапное сообщение. Он основан не на очереди сообщений, а на..

React on Rails
Основное приложение Reverb - это всеми любимый монолит Rails. Он отлично обслуживает наш API и уровень просмотра трафика. По мере роста мы добавляли больше интерактивных элементов..

Что такое гибкие методологии разработки программного обеспечения
Что представляют собой гибкие методологии разработки программного обеспечения в 2023 году Agile-методологии разработки программного обеспечения заключаются в следующем: И. Введение A...