Ruby:持久 HTTP 客户端未收到对第二个请求的响应
Ruby: Persistent HTTP client not receiving response on second request
我正在尝试创建一个使用持久连接的 HTTP 客户端。当我发送我的第一个请求并得到我的第一个响应时,我的代码有效。但是,当我发送第二个请求时,我无法得到第二个响应。我不确定为什么?我在用 C 编写代码时遇到了同样的错误。
这是代码
require 'socket'
include Socket::Constants
socket = Socket.new( AF_INET, SOCK_STREAM, 0 )
sockaddr = Socket.pack_sockaddr_in( 80, 'www.google.com' )
socket.connect( sockaddr )
# This Works
socket.write( "GET / HTTP/1.0\r\n\r\n" )
results = socket.read
# This Works
socket.write( "GET / HTTP/1.0\r\n\r\n" )
# THIS DOESN'T WORK
results = socket.read
我不想使用 Net::HTTP 这样的内置库。我需要做什么才能完成这项工作?
您不能在同一连接上发出 2 个 HTTP 请求,除非您已告知服务器您希望这样做。这就是 HTTP persistent connection
的工作原理。至少,您必须确保将此添加到您的请求中 header:
Connection: keep-alive
服务器对持久连接的支持各不相同,尽管服务器支持基本持久连接已变得很普遍。这是一个问 What exactly does a “persistent connection” mean?
的 SO 问题
从这里开始,您将找到使持久连接正常工作所需的知识。您可能需要检查 HTTP 响应 header 以了解服务器将接受您的请求的指示,或者您可能需要检查服务器在完成第一个响应的写入后是否简单地关闭了连接。在通过持久连接发出的最终请求中,您还应该指定 header:
Connection: close
另请查看这些资源:
我正在尝试创建一个使用持久连接的 HTTP 客户端。当我发送我的第一个请求并得到我的第一个响应时,我的代码有效。但是,当我发送第二个请求时,我无法得到第二个响应。我不确定为什么?我在用 C 编写代码时遇到了同样的错误。
这是代码
require 'socket'
include Socket::Constants
socket = Socket.new( AF_INET, SOCK_STREAM, 0 )
sockaddr = Socket.pack_sockaddr_in( 80, 'www.google.com' )
socket.connect( sockaddr )
# This Works
socket.write( "GET / HTTP/1.0\r\n\r\n" )
results = socket.read
# This Works
socket.write( "GET / HTTP/1.0\r\n\r\n" )
# THIS DOESN'T WORK
results = socket.read
我不想使用 Net::HTTP 这样的内置库。我需要做什么才能完成这项工作?
您不能在同一连接上发出 2 个 HTTP 请求,除非您已告知服务器您希望这样做。这就是 HTTP persistent connection
的工作原理。至少,您必须确保将此添加到您的请求中 header:
Connection: keep-alive
服务器对持久连接的支持各不相同,尽管服务器支持基本持久连接已变得很普遍。这是一个问 What exactly does a “persistent connection” mean?
的 SO 问题从这里开始,您将找到使持久连接正常工作所需的知识。您可能需要检查 HTTP 响应 header 以了解服务器将接受您的请求的指示,或者您可能需要检查服务器在完成第一个响应的写入后是否简单地关闭了连接。在通过持久连接发出的最终请求中,您还应该指定 header:
Connection: close
另请查看这些资源: