RubyのTCPソケットクラスを使用してTCPサーバーに接続しています。TCPソケット応答が準備完了するまで待つ方法
私はアドレスに関するいくつかのデータを送信します。私は、上記のアドレスのジオコーディングを私に与えるためにサーバが何らかの処理を行うのを待つ必要があります。サーバーの処理には時間がかかるため、すぐに応答を読み取ることはできません。
私がsocket.readpartial()
を使用したとき、私は2つの空白の応答を得ました。
私は一時的にsleep(5)
を使用して解決しましたが、これはまったく好きではありません。なぜなら、これはハックで不器用で、5秒後でもレスポンスが準備できていないためです。
私は応答が常に285文字であることを知っています。
TCPソケットが完全な応答を待つより正確で洗練された方法がありますか?あなたはread
、ないreadpartial
使うべき応答の長さを知っているので
def matchgeocode(rua, nro, cidade, uf)
count = 0
begin
socket = TCPSocket.new(GEOCODER_URL, GEOCODER_PORT)
# Needed for authentication
socket.write("TICKET #{GEOCODER_TICKET}")
socket.read(2)
# Here's the message I send to the server
socket.write("MATCHGEOCODE -Rua:\"#{rua}\" -Nro:#{nro} -Cidade:\"#{cidade}\" -Uf:\"#{uf}\"")
# My hackish sleep
sleep(5)
# Reading the fixed size response
response = socket.readpartial(285)
socket.write('QUIT')
socket.close
rescue Exception => e
count += 1
puts e.message
if count <= 5 && response.eql?('')
retry
end
end
response
end
これは私の専門分野ではありませんが、ソケットIOはデフォルトでブロックされていませんか?あなたが読んでみると、まだデータが読み込めない場合は、データが利用できるようになるまでRubyをブロックするべきではありませんか? –
AFAIKはい、私はちょうど私が空の応答を得るのを待つとき、私は睡眠の呼び出しを追加するまで正しい応答を得ません – Pankas
なぜあなたは 'readpartial'を使用していますか?あなたは何をしたいのですか? – matt