2016-05-20 4 views
0

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 
+1

これは私の専門分野ではありませんが、ソケットIOはデフォルトでブロックされていませんか?あなたが読んでみると、まだデータが読み込めない場合は、データが利用できるようになるまでRubyをブロックするべきではありませんか? –

+0

AFAIKはい、私はちょうど私が空の応答を得るのを待つとき、私は睡眠の呼び出しを追加するまで正しい応答を得ません – Pankas

+1

なぜあなたは 'readpartial'を使用していますか?あなたは何をしたいのですか? – matt

答えて

1

は、ここに私のコードです。

readpartialは、ANYデータが使用可能な場合はただちに返します。1バイトでも十分です。そのため、readpartialがどのデータが存在するかを調べる前に応答に戻る時間があるように、sleepコールが必要です。一方、要求されたすべてのデータが利用可能になるまでブロックする。あなたが結果の長さを知っているので、readはここの自然な解決策です。

関連する問題