Flutter开发进阶之使用Socket实现主机服务

news/2024/5/17 16:56:24 标签: flutter, websocket, tcp, udp, dart

Flutter开发进阶之使用Socket实现主机服务

在Flutter开发实践中,有一些业务是需要主从机合作搭配的服务,其中一些重要的数据和功能是交由主机进行存储和管理,从机再通过UDP和TCP与主机通讯去获得权限,一般在同一个局域网内的多端实现。
Flutter开发

广播

在主从机未建立联系之前,主从机除了自身的权限是已知的是不知道任何其他设备的信息的,这时候就需要利用到UDP的广播,因为在局域网中,UDP广播是一种允许设备向网络中的所有其他设备发送消息的技术;
广播地址通常是255.255.255.255,或者网络地址和主机地址的组合,主从机约定好广播的端口后,主机需要监听指定端口的UDP广播。

dart">  void udp_listen() async {
    // 监听所有可用地址5000端口的广播
    _socket = await RawDatagramSocket.bind("0.0.0.0", 5000);
    _socket?.listen((event) {
      switch (event) {
        case RawSocketEvent.read:
          Datagram? datagram = _socket?.receive();
          if (datagram != null) {
            const decoder = Utf8Decoder();
            print(decoder.convert(datagram.data));
            // 获取到广播信息,内容可能包括指定的加密后信息,可以是广播类型或者IP地址等
          }
          break;
        case RawSocketEvent.write:
          break;
        case RawSocketEvent.readClosed:
          break;
        case RawSocketEvent.closed:
          break;
      }
    }, onDone: () {
      _socket?.close();
      _socket = null;
    });
  }

主机开启监听后,从机可以发送广播了。

dart">void udp_send() async {
    _socket = await RawDatagramSocket.bind("0.0.0.0", 5000);
    var message = "xxxxxxxxxx";
    final data = Uint8List.fromList(message.codeUnits);
    await _socket?.send(data, InternetAddress.anyIPv4, 5000);
  }

此时主从机已经完成了数据交互,主机已获知了从机的相关信息,可以建立指定的广播或者直接建立TCP通讯了;
此时我们可以使用flutter_socket_io库进行TCP通信,可以通过创建自定义的连接池来管理连接,连接池可以帮助你重用现有的连接,而不是为每个请求创建新的连接,从而提高性能和效率。

连接池

dependencies:  
  flutter_socket_io: ^latest_version

创建一个自定义的连接池类,这个类将负责管理连接的生命周期和重用现有的连接。

dart">class ConnectionPool {  
  final int maxConnections = 5; // 设置最大连接数  
  final String host = '127.0.0.1'; // 设置服务器地址  
  final int port = 8080; // 设置服务器端口  
  
  Map<int, Socket> _pool = {}; // 用于存储连接的映射  
  int _nextId = 0; // 用于生成唯一的连接ID  
  
  Socket getConnection() {  
    int id = _nextId++;  
    Socket socket = Socket.fromAddress(host, port);  
    _pool[id] = socket;  
    return socket;  
  }  
  
  void releaseConnection(Socket socket) {  
    // 在这里实现连接释放的逻辑,例如关闭连接等操作  
  }  
}

收发消息

以下是一些简单的示例,实际开发中还需注意后续的线程安全、各种网络异常等问题。

dart">Socket socket = connectionPool.getConnection();
socket.listen((data) {  
  print('Received: $data');  
});
dart">Future<String> sendMessage(String message) async {  
    try {  
      Socket socket = connectionPool.getConnection(); // 获取连接  
      // 使用socket发送消息并处理响应  
      socket.write('你要发送的消息');
      // ...  
      socket.close(); // 释放连接  
      return 'Message sent successfully';  
    } catch (e) {  
      print('Error sending message: ${e.toString()}');  
      return 'Failed to send message';  
    }  
  }  

http://www.niftyadmin.cn/n/5338442.html

相关文章

回调地狱与解决方案

什么是回调地狱&#xff1f; 简单理解就是回调函数嵌套回调 示例&#xff1a; setTimeout(() > {console.log(1);setTimeout(() > {console.log(2);setTimeout(() > {console.log(3);}, 1000);}, 2000)}, 3000)如上代码所示&#xff0c;回调函数嵌套回调&#xff0c;就…

P2717 寒假作业 CDQ

寒假作业 传送门 题目背景 zzs 和 zzy 正在被寒假作业折磨&#xff0c;然而他们有答案可以抄啊。 题目描述 他们共有 n n n 项寒假作业。zzy 给每项寒假作业都定义了一个疲劳值 a i a_i ai​&#xff0c;表示抄这个作业所要花的精力。 zzs 现在想要知道&#xff0c;有多…

SQL两表/多表关联查询--JOIN语句

一、基础概念 SQL中的关联是通过JOIN关键字实现的&#xff0c;JOIN关键字有几种类型&#xff0c;包括INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN等。 二、INNER JOIN详解 INNER JOIN是最常用的关联方式之一&#xff0c;它返回 两个表中共同存在的数据行。 其语法…

Unity SnapScrollRect 滚动 匹配 列表 整页

展示效果 原理: 当停止滑动时 判断Contet的horizontalNormalizedPosition 与子Item的缓存值 相减,并得到最小值&#xff0c;然后将Content horizontalNormalizedPosition滚动过去 使用方式&#xff1a; 直接将脚本挂到ScrollRect上 注意&#xff1a;在创建Content子物体时…

探索Docker-Compose:从基础到高级命令全解析

探索Docker-Compose&#xff1a;从基础到高级命令全解析 引言Docker-Compose基础1. Docker-Compose简介2. 安装Docker-Compose3. 编写第一个Compose文件4. 基本命令 Docker-Compose文件结构解析1. 理解docker-compose.yml2. 基本组件3. 文件示例4. 配置项解析 常用Docker-Compo…

Python学习之路-Python操作redis

Python学习之路-Python操作redis 前言 在Python中操作Redis可以直接用redis模块 安装 安装Redis的有3种方式https://github.com/andymccurdy/redis-py 第一种&#xff1a;进⼊虚拟环境py_django&#xff0c;联⽹安装包redis pip install redis第二种&#xff1a;进⼊虚拟环…

【数据结构】 双链表的基本操作 (C语言版)

目录 一、双链表 1、双链表的定义&#xff1a; 2、双链表表的优缺点&#xff1a; 二、双链表的基本操作算法&#xff08;C语言&#xff09; 1、宏定义 2、创建结构体 3、双链表的初始化 4、双链表表插入 5、双链表的查找 6、双链表的取值 7、求双链表长度 8、双链表…

如何调整服务器系统时间

要调整服务器系统时间&#xff0c;可以按照以下步骤操作&#xff1a; 在服务器上登录到管理员账户或具有管理员权限的用户账户。打开命令提示符&#xff08;Windows&#xff09;或终端&#xff08;Linux/Unix&#xff09;。输入以下命令以查看当前系统时间&#xff1a; Windo…