我正在开发一个接收请求的HTTPS
服务器,并且必须以3个响应进行回答。前两个是应答行,最后一个包含所请求的信息。
我正在使用Web浏览器(chrome)作为客户端。我想要的是以下内容:
浏览器(客户端)将请求发送到服务器。
服务器发送第一个ACK(一个html页面),然后浏览器显示它。
两秒钟后,服务器将发送另一个ACK(另一个html页面),浏览器将显示它。
再过两秒钟,服务器发送请求的信息(另一个html页面),然后浏览器显示该信息。
问题在于浏览器仅收到第一个ACK,似乎它在读取套接字后正在关闭套接字,甚至在Connection
标头中将keep-alive
设置为HTTPS
。
有什么方法可以通过网络浏览器等待几个HTTPS
响应吗?
资源
这包含在进行请愿时服务器执行的异步方法:
void handle_handshake(const boost::system::error_code& error)
{
if (!error)
{
boost::asio::async_read_until(socket_, request_, "\r\n\r\n",
boost::bind(&session::handle_read, this,
boost::asio::placeholders::error));
}
else
{
std::cout << "ERROR, deleting. " << __FILE__ << ":" << __LINE__ << std::endl;
delete this;
}
}
void handle_read(const boost::system::error_code& err)
{
if (!err)
{
std::string s = "some_response";
// First write. This write is received by the browser without problems.
boost::asio::async_write(socket_,
boost::asio::buffer(response),
boost::bind(&session::handle_write, this,
boost::asio::placeholders::error));
}
else
{
std::cout << "Error: " << err << "\n";
}
}
void handle_write(const boost::system::error_code& error)
{
if (!error)
{
if(n++ <= 2)
{
// Second and third writes.
// These ones are not read by the browser.
if(n == 1)
{
std::string s = "some_response2";
boost::asio::async_write(socket_,
boost::asio::buffer(response),
boost::bind(&session::handle_write, this,
boost::asio::placeholders::error));
}
else if (n==2)
{
std::string s = "some_response3";
boost::asio::async_write(socket_,
boost::asio::buffer(response),
boost::bind(&session::handle_write, this,
boost::asio::placeholders::error));
}
sleep(1);
}
}
else
{
std::cout << "ERROR, deleting: " << __FILE__ << ":" << __LINE__ << std::endl;
delete this;
}
}
最佳答案
好的,您想克服启动缓慢的问题,即建立新连接并为新连接进行三向握手-整个往返延迟。
尽管我无法获得有关执行此操作的正确代码段。一个大胆的猜测是,您必须忘记设置超时(SO_RCVTIMEO
和SO_SNDTIMEO
)以保持连接或使用错误的HTTP版本。
注意:默认情况下,HTTP / 1.1中启用了保持活动连接,而HTTP / 1.0中则未启用。 HTTP / 1.0旨在在客户端和服务器之间的每个请求之后关闭连接。我们实际上可以使用telnet来检查这种差异。
从性能的角度来看,我编写了两个(python)脚本-一个脚本对50个连续的请求使用相同的连接,而一个脚本针对每个请求启动一个新的连接。
Average time with keep-alive/persistent connections: 7.00 seconds
Average time with new connections: 22.38 seconds
我们知道,保持连接/持久连接的差值几乎是3个顺序,因此避免了三向握手(完全往返延迟)。慢启动在这里不会产生太大影响,因为请求和响应非常小,因此所需的带宽非常低。
PS:仔细检查this
boost::asio::ip::tcp::socket socket(io_service);
...
boost::asio::socket_base::keep_alive option;
socket.get_option(option);
客户端需要保持端口开放,因为服务器已配置(预设)以侦听特定端口上的特定应用程序
我从here获得了以上代码段