Flutter-Socket

500 阅读1分钟

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协议。