Ruby 模拟 curl 的请求 sock.gets 很长时间才得到响应,但是 curl 很快就返回结果

tablecell · 发布于 2016年11月30日 · 最后由 luikore 回复于 2016年12月27日 · 445 次阅读
20099
require 'socket'  
hostname='www.ruby-china.org'
#ua='Mozilla/5.0 (Windows NT 6.2) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.79 Safari/535.11'
header={'User-Agent'=>'curl/7.30.0',
'Host'=>hostname,
'Accept'=>'*/*'
 }
req="GET / HTTP/1.1\r\n"
header.each {|key, value| req+= "#{key}: #{value}\r\n" }
req+="\r\n"
port =80
sock = TCPSocket.open(hostname, port)
 sock.print req

  while line = sock.gets   
    puts line.chop       
  end
sock.close               



共收到 4 条回复
2880
luikore · #1 · 2016年12月25日

你可以先 sock.close_write 再读, 马上就能读到 EOF.

不然只能按照 HTTP 协议的, 解析响应 header 的 Content-Length 来读.

20099
tablecell · #2 · 2016年12月26日

#1楼 @luikore 文档上写的是 Disallows further write using shutdown system call. 这个socket.close_write与 直接socket.close有什么区别吗?

9442
flowerwrong · #3 · 2016年12月26日

#2楼 @tablecell 你可以查一查怎么实现pipe,然后就可以理解了。

2880
luikore · #4 · 2016年12月27日

#2楼 @tablecell 有区别, close 了 write 但没 close read.

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册