開源中國參考**:
為了方便描述,這裡只分析一下同步實現,非同步實現方式和同步方式的流程是一致的,只是在函式呼叫的方式上有些區別.分析清楚了同步方式,在看非同步實現,也很容易.
這個http範例實現了客戶端向服務端請求檔案內容的功能,客戶端給出乙個檔名稱,服務端在本地尋找檔案,並將檔案內容(文字檔案)返回給客戶端.
main函式首先檢查傳遞給exe執行檔案的引數,第乙個引數是服務端的ip位址,第二個引數是請求的檔名稱,如果僅指定了目錄而沒有具體的檔名,則在這個目錄中查詢index.htm檔案.
//定義io_service物件例項,任何使用asio的程式中都要進行定義,是asio庫的核心實現.
boost::asio::io_service io_service;
//argv[1]是服務端ip位址,由程式呼叫方提供,
//在指定伺服器上尋找http服務,並獲取網路端點
// 嘗試獲取到的每個端點,直到建立了乙個有效的鏈結.
tcp::socket socket(io_service);
boost::asio::connect(socket, endpoint_iterator);
至此,鏈結建立成功.接下來就是向服務端傳送和接受資料了.
//建立乙個流緩衝區,用來儲存傳送和接受的資料
boost::asio::streambuf request;
//將流緩衝區與乙個輸出流ostream繫結,對ostream的輸出操作最終都存入到流緩衝區.
std::ostream request_stream(&request);
//根據客戶端與服務端制定的協議,組織http請求包的頭資訊.argv[2]指定了檔名稱.
//向服務端傳送http請求
boost::asio::write(socket, request);
這時http服務端接受到客戶端傳送的請求後,按雙邊協議對請求資訊進行解析,獲取到檔名稱和http協議的版本號,並進行相應的處理,將http響應狀態資訊,包頭資訊和檔案內容傳送給客戶端.客戶端接收這些資訊,並進行檢查處理.
接收響應的狀態資訊:
//定義接收響應資料的流緩衝區
boost::asio::streambuf response;
//從服務端接收響應包的頭資訊,描述響應的狀態
//流緩衝區可根據接收的資料自動調節大小,可在其建構函式中指定最大流緩衝區.
boost::asio::read_until(socket, response, "\r\n");
檢查響應包的狀態:
//將流緩衝區與istream相關聯,可方便的從流緩衝區中提取出資訊
//獲取http版本號
//獲取響應資訊的狀態碼
response_stream >> status_code;
std::string status_message;
//獲取狀態資訊
std::getline(response_stream, status_message);
//檢查包是否為http請求的響應包
if (status_code != 200)//狀態碼為200表示請求成功,否則失敗
std::cout << "response returned with status code " << status_code << "\n";
return 1;
如果檢查通過,則開始接收響應包的包頭.
boost::asio::read_until(socket, response, "\r\n\r\n");
//處理響應包頭資訊
std::string header;
while (std::getline(response_stream, header) && header != "\r")
std::cout << header << "\n";
std::cout << "\n";
// 列印出所有輸出的資訊
if (response.size() > 0) std::cout << &response;
現在開始接收檔案內容,直到遇到了eof符號,並將接收到的資料直接輸出
boost::system::error_code error;
//read函式返回接收到的位元組數,這裡用了while迴圈,表示一直接收,直到接收不到為止.
// transfer_at_least 函式返回transfer_at_least_t型別,
//這是乙個函式物件,會將接收到的資料位元組數與其引數相比較,
//如果大於等於指定數量則返回,這裡指定為1表示接收到資料就返回處理.
while (boost::asio::read(socket, response,
boost::asio::transfer_at_least(1), error))
std::cout << &response;//直接將接收到的資料進行顯示
if (error != boost::asio::error::eof)
throw boost::system::system_error(error);
緩衝流之字元緩衝流
字元緩衝流 字元緩衝輸入流 bufferedreader 字元緩衝輸出流 bufferedwriter 完成文字資料的高效的寫入與讀取的操作 1字元緩衝輸出流 bufferedwriter void newline 根據當前的系統,寫入乙個換行符 public static void method0...
IO流 位元組緩衝流,字元緩衝流
處理流 裝飾流 位元組緩衝流,字元緩衝流 用於提高位元組流的效能 bufferedinputstream,bufferedoutputstream 位元組緩衝流 bufferedinputstream is newbufferedinputstream new fileinputstream fil...
緩衝流物件 緩衝流物件寫
這裡我們說一下常用的字元緩衝流物件,位元組緩衝流物件不常用。緩衝流物件寫 bufferrdreader 緩衝流物件讀 bufferred writer 如果想要使用想使用緩衝流來進行寫的操作就必須先使用字元流的寫操作。下面我們來看一下如何使用 來使用緩衝流物件進行寫。建立字元流讀取物件 需要檔案路徑...