checkConnectServerAddress method

Future<String> checkConnectServerAddress(
  1. int serverPort, {
  2. ValueChanged<Socket>? conectSuccess,
  3. HostHandle? hostHandle,
  4. Duration? timeOut,
  5. String? initHost,
})

获取服务器IP,也就是用户电脑的IP

Implementation

Future<String> checkConnectServerAddress(int serverPort,
    {ValueChanged<Socket>? conectSuccess,
    HostHandle? hostHandle,
    Duration? timeOut,
    String? initHost}) async {
  try {
    List<Future<String>> futureList = [];
    if (initHost != null) {
      var s = await Socket.connect(initHost, serverPort, timeout: timeOut);
      conectSuccess?.call(s);
      return initHost;
    } else {
      String? ip = await NetworkInfo().getWifiIP();
      if (ip != null) {
        final indexs = List.generate(256, (index) => index + 1);
        await Future.forEach(indexs, (element) async {
          var v = "";
          if (v.isEmpty) {
            v = await Future<String>.sync(() async {
              final host = '${ip.substring(0, ip.lastIndexOf('.'))}.$element';
              final isHandle = hostHandle?.call(host) ?? true;
              if (isHandle) {
                try {
                  var s = await Socket.connect(host, serverPort,
                      timeout: timeOut);
                  conectSuccess?.call(s);
                  s.listen((event) {}).onError((e) {
                    ddCheckPluginLog('onError:$e');
                  });

                  return host;
                } catch (e) {
                  ddCheckPluginLog("socket-连接断开:$e");
                  return '';
                }
              }
              return "";
            });
          }
        });
      }
      List<String> results = await Future.wait<String>(futureList);
      return results.firstWhere((e) => e.isNotEmpty, orElse: () => '');
    }
  } catch (e) {
    throw const ConnectException("FlutterX: connection fail");
  }
}