我正在使用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
答案 0 :(得分:1)
由于您知道回复的长度,因此应使用read
,而不是readpartial
。
readpartial
会立即返回,即使一个字节就足够了。这就是为什么你需要sleep
调用,以便在readpartial
试图查看存在的数据之前,响应有时间返回给你。
read
完全阻止,直到所有请求的数据都可用。既然您知道结果的长度,那么read
就是这里的自然解决方案。