Flutter开发进阶之使用Socket实现主机服务(二)
Flutter开发进阶之使用Socket实现主机服务(一)
 在完成局域网内设备定位后就可以进入微服务的实操了。
 
I、构建Socket连接池
一、定义Socket
使用socket_io_client
socket_io_client: ^2.0.3+1
 
导入头文件
import 'package:socket_io_client/socket_io_client.dart' as io;
 
定义属性
class _SocketIoObject {
   
  /// 连接
  io.Socket? socket; 
  /// 连接次数
  int count = 0; 
  /// 创建的时间
  int createTime = 0; 
  /// 根据连接频率获取的优先级
  double proportion = 0; 
}
 
二、定义连接池
class SocketIoPool {
   
  /// 连接池本身
  static Map<String, dynamic> sockets = {
   }; 
  /// 连接最大数量
  static int maxCount = 10; 
  /// 根据优先级获取到
  /// 最应该销毁的连接的key
  static String exitKey = ""; 
}
 
三、连接池运行逻辑
连接排序
/// 将连接按照优先级排序
/// 使用频率越低的连接的优先级越高
/// 可以被销毁
/// 
static void _sortSocket() {
   
    int now = DateTime.now().millisecondsSinceEpoch;
    double maxProportion = 0;
    sockets.forEach((key, value) {
   
      value.proportion = (now - value.createTime) / value.count;
      if (value.proportion > maxProportion) {
   
        maxProportion = value.proportion;
        exitKey = key;
      }
    });
  }
 
连接创建
/// 创建新连接时限制最大连接数量
/// 
static io.Socket _newSocket(String host, int port) {
   
    if (sockets.length >= maxCount && exitKey.isNotEmpty) {
   
      _SocketIoObject? object = sockets[exitKey];
      if (object != null) {
   
        object.socket?.disconnect();
        object.socket?.dispose();
        sockets.remove(exitKey);
      }
    }
    String relative = "$host:$port";
    io.Socket socket = io.io(relative);
    sockets[relative] = _SocketIoObject()
      ..socket = socket
      ..count = 1
      ..createTime = DateTime.now().millisecondsSinceEpoch;
    Future(() => _sortSocket());
    
                

















