2014-12-10 1 views
0

Я пытаюсь продолжить цикл while 3 раза. Если я получаю данные с сервера, цикл должен прерываться. Но в приведенном ниже коде while цикл заканчивается после ответа один раз. Что мне делать?Ruby while loop выполняется только один раз с break, если оператор

@i = 0 
while @i < 3 
    udp_socket.send req_param[:msg], req_param[:flag], req_param[:url], req_param[:port] 
    @i +=1 
    puts "#{@i}" 
    if udp_socket.recvfrom(100) 
     break 
    end 
end 
    for j in 0..1 
    resp = udp_socket.recvfrom(100) 
    puts "resp:#{resp.inspect}" 
end 
udp_socket.close 
return resp 
+2

Что такое возвращение строки: 'udp_socket.recvfrom (100) '? Потому что это условие разрыва, даже до третьего раза. – lcguida

+0

Возврат строки, которую вы запросили, мгновенно от сервера (т. Е. Простая строка типа «1200») – Shubham

+0

Итак, он всегда отвечает строкой? Если да, то условие всегда будет истинным, а время будет прекращено в первый раз. – lcguida

ответ

0

recvfrom (наследуется от родительского IPSocket) будет блокировать до тех пор, пока он получает данные (если опция NONBLOCK не установлен). Это означает, что это будет не фальсифицированный возврат, а разрыв. Он всегда будет ждать, пока не появятся данные и не сломается.

Возможно, вы имели целью неблокировать? - вместо этого вызывается метод recvfrom_nonblock?

+0

Я проверил с recvfrom_nonblock, но показывая его error.Error: Неблокируемая операция сокета не может быть выполнена немедленно. - recvfrom (2) будет блокировать – Shubham

+0

. Это означает, что он будет блокироваться до тех пор, пока не истечет время или не получит что-то - а затем перерыв - он будет принимать только три повторных попытки, если это истечет, если только это не порождает исключение. –

+0

Вы можете написать образец udp-кода для отправки запроса на сервер, а затем до того, когда вы не получите ответ от сервера, он будет отправлять один и тот же запрос 3 раза через каждые 3 секунды в 5 раз на тот же сервер? – Shubham

0

Глядя на код, кажется, вы не обновляя resp переменной внутри while цикла, код изменения на что-то вроде этого, вместо:

j = 1 
resp = udp_socket.recvfrom(100) 
if resp 
    udp_socket.close 
    return resp 
end 
while j < 3 
    udp_socket.send req_param[:msg], req_param[:flag], req_param[:url], req_param[:port] 
    resp = udp_socket.recvfrom(100) 
    j += 1 
    puts "ok" 
    break if resp 
end 
puts "resp:#{resp.inspect}" 
+0

Я могу достичь несколько, но все же отправив запрос в 2 раза с этим кодом '@i = 0 $ Var = ноль Thread.new делают в то время как @i <3 udp_socket.send req_param [: тзд], req_param [: флаг], req_param [: URL], req_param [: порт] @i + = 1 пут «# { @i} " ставит "# {$ вара}" если ($ вар! = Ноль) перерыва конца конца конца $ Var = udp_socket.recvfrom (100) ' – Shubham

+0

Я хочу написать рубиновый код, в котором первый я отправить запрос на сервер, то подождите 5 секунд, чтобы получить ответ от сервера. Если я получу ответ от сервера, тогда он выполнит следующую задачу, и если я не получу ответ в 5 секунд, то тот же запрос будет отправлен на сервер 4 раза с интервалом в 3 секунды. При отправке запроса на 4 раза, если я получаю ответ в любом экземпляре, он перестанет отправлять запрос дальше на сервер.Можете ли вы мне помочь написать код для этого. – Shubham