我創建了一個異步Beast服務器,它從瀏覽器獲得一個請求,打開第二個套接字,寫下請求,獲得回應并將其發回給瀏覽器。 所有這些都是異步的。"發回給瀏覽器 "的動作等待讀取處理程式完成后觸發
。void
on_write(
boost::system::error_code ec,
std::size_t bytes_transferred)。
{
boost::ignore_unused(bytes_transferred)。
if(ec)
return fail2(ec, "write") 。
std::cout << "===========on_write============" << std::endl;
stopper("async_write" , 0) 。
stopper("on_write" , 1) 。
//接收HTTP回應。
http::async_read(redirect_stream_, redirect_buffer_, redirect_res_,
std::bind(
&session2::on_read,
shared_from_this()。
std::placeholders::_1,
std::placeholders::_2))。
}
void
on_read(
boost::system::error_code ec,
std::size_t bytes_transferred)
{
boost::ignore_unused(bytes_transferred)。
if(ec)
return fail2(ec, "read")。
std::cout << "===========on_read============" << std::endl;
stopper("on_write" , 0) 。
stopper("on_read" , 1) 。
//將資訊寫入標準輸出。
std::cout << redirect_res_.base() << std::endl;
http::async_write(stream_, redirect_res_,
std::bind(
&session2::start_shutdown,
shared_from_this()。
std::placeholders::_1,
std::placeholders::_2))。)
// Gracefully close the stream。
}
從我所做的檢查來看,在觸發 "寫到瀏覽器 "的動作(on_read函式)之前,似乎需要很長時間。 是否有更好的方法來減少對瀏覽器的回應時間? 也許通過 "read_some "方法?
uj5u.com熱心網友回復:
這在很大程度上取決于目標。如果你真的希望在不做任何修改的情況下透明地傳遞請求/回應,那么read_some將是一個更好的方法(但是你不需要Beast的任何東西,只需要Asio)。
使用Beast,你也可以讀取部分請求,假設你可能想修改一些關于被轉發的訊息的東西,你可以用message_parser<...>代替message<>并使用http::read_header和一個回圈讀取buffer_body。
在檔案中,有一個例子可以實作這樣的事情。HTTP Relay 示例.
你也可以搜索我的答案。https://stackoverflow.com/search?q=user:85371 beast read_header或為
buffer_body和或request_parser/response_parser
除此之外,還有很多小方法可以減少延遲(合理規劃執行緒、執行器、分配器)。但對于這樣的事情,你也許應該發布你的代碼(到 CodeReview?
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/318046.html
標籤:
上一篇:fetchapi不能加載,不支持url方案'file'。
下一篇:在等待異步函式完成時禁用按鈕
