Чтение данных из сокета в ruby ​​в многопоточной среде - PullRequest
0 голосов
/ 10 сентября 2010

Я пытаюсь прочитать HTTP-пакет через сокет в ruby, и по какой-то причине мой код продолжает блокироваться при вызове recv

socket = TCPSocket.new("localhost",80)
socket.send r.join("\r\n"), 0
socket.flush
#We're only interested in the string "HTTP/1.1 XXX"
if http_status = get_http_status(socket.recv_nonblock(12))
    if http_status == 200
        $logger.info "Wrote #{message_packet}"
    else
        $logger.warn "Resubmitting message because #{line} is not 200"
        @queue.publish(message) 
    end
end

#Get rid of the rest of the content
the_rest = socket.recv(1000)
while(the_rest != "") do
    the_rest = socket.recv(1000)    
end

Из того, что я понимаю recv, ничего не должно возвращаться, если в сокете нет данных, ожидающих?

1 Ответ

0 голосов
/ 11 сентября 2010

Соединение может быть соединением поддержки активности. Итак, ваш вызов recv () не закончится сам по себе. Вам нужно прочитать заголовок Content-Lenght, а затем прочитать столько байтов из содержимого. После этого вы можете выйти из цикла RECV.

Или, альтернативно, выполните запрос, установив заголовок «Connection: close», чтобы сервер закрыл соединение после отправки ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...