Socket API是系统为实现应用层网络协议提供的一套基础的、标准的API,它是对传输层网络协议(TCP /UDP)的一种封装。Socket API实现了端到端建立连接发发送/接收数据的基础API,而高级编程语言中的Socket API其实都是对操作系统Socket API的封装。
之前介绍的Http协议和WebSocket协议都属于应用层协议,除了它们,应用层协议还有很多,比如:SMTP、FTP等,这些应用层协议都是通过Socket API来实现的。
综上,如果需要自定义协议或者想直接来控制管理网络链接,或者觉得自导的HttpClient不好用,想要重新实现,这时就需要使用Socket。Flutter的Socket API在dart:io中。
使用Socket实现http get请求
以请求百度首页为例:
import 'dart:convert';
import 'dart:io';
import 'package:flutter/material.dart';
class SSLSocketRoute extends StatelessWidget{
const SSLSocketRoute({Key? key}):super(key: key);
@override
Widget build(BuildContext context) {
// TODO: implement build
return Scaffold(
appBar: AppBar(
title: const Text("SSL Socket"),
),
body: FutureBuilder(
future: requestData(),
builder: (context, snapshot){
return Text(snapshot.data.toString());
},
),
);
}
requestData() async {
//建立链接
var socket = await Socket.connect("baidu,con", 80);
//根据Http协议发起get请求头
socket.writeln("GET / HTTP/1.1");
socket.writeln("Host:baidu.com");
socket.writeln("Connection:close");
socket.writeln();
//发送
await socket.flush();
//读取返回内容,按照UF8解码为字符串
String response = await utf8.decoder.bind(socket).join();
//关闭链接
await socket.close();
return response;
}
}
可以看到,使用Socket需要自己实现Http协议。