## Socket
我們之前介紹的Http協議和WebSocket協議都屬于應用層協議,除了它們,應用層協議還有很多如:SMTP、FTP等,它們都是通過Socket實現的。其實,操作系統中提供的原生網絡請求API是標準的,在C語言的Socket庫中,它主要提供了端到端建立鏈接和發送數據的基礎API,而高級編程語言中的Socket庫其實都是對操作系統的socket API的一個封裝。所以,如果我們需要自定義協議或者想直接來控制管理網絡鏈接、又或者我們覺得自帶的HttpClient不好用想重新實現一個,這時我們就需要使用Socket。Flutter的Socket API在dart io包中,下面我們看一個使用Socket實現簡單http請求的示例,以請求百度首頁為例:
```
_request() async{
//建立連接
var socket=await Socket.connect("baidu.com", 80);
//根據http協議,發送請求頭
socket.writeln("GET / HTTP/1.1");
socket.writeln("Host:baidu.com");
socket.writeln("Connection:close");
socket.writeln();
await socket.flush(); //發送
//讀取返回內容
_response =await socket.transform(utf8.decoder).join();
await socket.close();
}
```
可以看到,使用Socket需要我們自己實現Http協議細節,本例只是一個簡單示例,沒有處理重定向、cookie等。本示例完整代碼參考示例demo,運行后如下:

可以看到響應內容分兩個部分,第一部分是響應頭,第二部分是響應體,服務端可以根據請求信息動態來輸出響應體。由于本示例請求頭比較簡單,所以響應體和瀏覽器中訪問的會有差別,讀者可以補充一些請求頭(如user-agent)來看看輸出的變化。
- 緣起
- 起步
- 移動開發技術簡介
- Flutter簡介
- 搭建Flutter開發環境
- 常見配置問題
- Dart語言簡介
- 第一個Flutter應用
- 計數器示例
- 路由管理
- 包管理
- 資源管理
- 調試Flutter APP
- Dart線程模型及異常捕獲
- 基礎Widgets
- Widget簡介
- 文本、字體樣式
- 按鈕
- 圖片和Icon
- 單選框和復選框
- 輸入框和表單
- 布局類Widgets
- 布局類Widgets簡介
- 線性布局Row、Column
- 彈性布局Flex
- 流式布局Wrap、Flow
- 層疊布局Stack、Positioned
- 容器類Widgets
- Padding
- 布局限制類容器ConstrainedBox、SizeBox
- 裝飾容器DecoratedBox
- 變換Transform
- Container容器
- Scaffold、TabBar、底部導航
- 可滾動Widgets
- 可滾動Widgets簡介
- SingleChildScrollView
- ListView
- GridView
- CustomScrollView
- 滾動監聽及控制ScrollController
- 功能型Widgets
- 導航返回攔截-WillPopScope
- 數據共享-InheritedWidget
- 主題-Theme
- 事件處理與通知
- 原始指針事件處理
- 手勢識別
- 全局事件總線
- 通知Notification
- 動畫
- Flutter動畫簡介
- 動畫結構
- 自定義路由過渡動畫
- Hero動畫
- 交錯動畫
- 自定義Widget
- 自定義Widget方法簡介
- 通過組合現有Widget實現
- 實例:TurnBox
- CustomPaint與Canvas
- 實例:圓形漸變進度條(自繪)
- 文件操作與網絡請求
- 文件操作
- Http請求-HttpClient
- Http請求-Dio package
- 實例:Http分塊下載
- WebSocket
- 使用Socket API
- Json轉Model
- 包與插件
- 開發package
- 插件開發:平臺通道簡介
- 插件開發:實現Android端API
- 插件開發:實現IOS端API
- 系統能力調用
- 國際化
- 讓App支持多語言
- 實現Localizations
- 使用Intl包
- Flutter核心原理
- Flutter UI系統
- Element和BuildContext
- RenderObject與RenderBox
- Flutter從啟動到顯示