Flutter實(shí)戰(zhàn) 使用Socket API

2021-03-09 10:11 更新

我們之前介紹的 Http 協(xié)議和 WebSocket 協(xié)議都屬于應(yīng)用層協(xié)議,除了它們,應(yīng)用層協(xié)議還有很多如:SMTP、FTP 等,這些應(yīng)用層協(xié)議的實(shí)現(xiàn)都是通過 Socket API 來實(shí)現(xiàn)的。其實(shí),操作系統(tǒng)中提供的原生網(wǎng)絡(luò)請(qǐng)求 API 是標(biāo)準(zhǔn)的,在 C 語言的 Socket 庫中,它主要提供了端到端建立鏈接和發(fā)送數(shù)據(jù)的基礎(chǔ) API,而高級(jí)編程語言中的 Socket 庫其實(shí)都是對(duì)操作系統(tǒng)的 socket API 的一個(gè)封裝。所以,如果我們需要自定義協(xié)議或者想直接來控制管理網(wǎng)絡(luò)鏈接、又或者我們覺得自帶的 HttpClient 不好用想重新實(shí)現(xiàn)一個(gè),這時(shí)我們就需要使用 Socket。Flutter 的 Socket API 在 dart:io 包中,下面我們看一個(gè)使用 Socket 實(shí)現(xiàn)簡單 http 請(qǐng)求的示例,以請(qǐng)求百度首頁為例:

_request() async{
  //建立連接
  var socket=await Socket.connect("baidu.com", 80);
  //根據(jù)http協(xié)議,發(fā)送請(qǐng)求頭
  socket.writeln("GET / HTTP/1.1");
  socket.writeln("Host:baidu.com");
  socket.writeln("Connection:close");
  socket.writeln();
  await socket.flush(); //發(fā)送
  //讀取返回內(nèi)容
  _response =await socket.transform(utf8.decoder).join();
  await socket.close();
}

可以看到,使用 Socket 需要我們自己實(shí)現(xiàn) Http 協(xié)議(需要自己實(shí)現(xiàn)和服務(wù)器的通信過程),本例只是一個(gè)簡單示例,沒有處理重定向、cookie 等。本示例完整代碼參考示例 demo,運(yùn)行后效果如圖11-2所示:

圖11-2

可以看到響應(yīng)內(nèi)容分兩個(gè)部分,第一部分是響應(yīng)頭,第二部分是響應(yīng)體,服務(wù)端可以根據(jù)請(qǐng)求信息動(dòng)態(tài)來輸出響應(yīng)體。由于本示例請(qǐng)求頭比較簡單,所以響應(yīng)體和瀏覽器中訪問的會(huì)有差別,讀者可以補(bǔ)充一些請(qǐng)求頭(如user-agent)來看看輸出的變化。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)