如何等待TCP套接字响应准备就绪

时间:2016-05-20 20:54:13

标签: ruby sockets tcp

我正在使用Ruby的TCPSocket类连接到TCP服务器。

我发送了一些有关地址的数据,我必须等待服务器进行一些处理,以便为我提供所述地址的地理编码。由于服务器中的进程需要一些时间,我无法立即读取响应。

当我使用socket.readpartial()时,我得到两个空格的响应。

我暂时使用sleep(5)解决了这个问题,但我根本不喜欢这个,因为它是hackish和笨拙的,我冒险即使在5秒之后响应还没有准备好我仍然得到一个空的响应

我知道答案总是长达285个字符。

是否有更正确和优雅的方法让我的TCP套接字等待完整响应?

这是我的代码:

  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 个答案:

答案 0 :(得分:1)

由于您知道回复的长度,因此应使用read,而不是readpartial

如果有任何数据可用,

readpartial会立即返回,即使一个字节就足够了。这就是为什么你需要sleep调用,以便在readpartial试图查看存在的数据之前,响应有时间返回给你。

另一方面,

read完全阻止,直到所有请求的数据都可用。既然您知道结果的长度,那么read就是这里的自然解决方案。