From 2faea10d611a38a3b753dd92b9771e584d692130 Mon Sep 17 00:00:00 2001 From: lollipopkit Date: Wed, 1 Feb 2023 13:34:45 +0800 Subject: [PATCH] server connect: max try 7 times --- lib/core/utils/server.dart | 6 +++++- lib/data/provider/server.dart | 33 ++++++++++++++++++++++++++++---- lib/data/res/misc.dart | 1 + lib/view/page/home.dart | 2 +- lib/view/page/server/detail.dart | 2 +- lib/view/page/server/tab.dart | 2 +- lib/view/page/ssh.dart | 6 +++--- 7 files changed, 41 insertions(+), 11 deletions(-) create mode 100644 lib/data/res/misc.dart diff --git a/lib/core/utils/server.dart b/lib/core/utils/server.dart index ce5617db..79ffb615 100644 --- a/lib/core/utils/server.dart +++ b/lib/core/utils/server.dart @@ -15,7 +15,11 @@ List loadIndentity(String key) { } Future genClient(ServerPrivateInfo spi) async { - final socket = await SSHSocket.connect(spi.ip, spi.port); + final socket = await SSHSocket.connect( + spi.ip, + spi.port, + timeout: const Duration(seconds: 5), + ); if (spi.pubKeyId == null) { return SSHClient( socket, diff --git a/lib/data/provider/server.dart b/lib/data/provider/server.dart index 16d91c13..5940c763 100644 --- a/lib/data/provider/server.dart +++ b/lib/data/provider/server.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:flutter/foundation.dart'; import 'package:logging/logging.dart'; +import 'package:toolbox/data/res/misc.dart'; import '../../core/extension/uint8list.dart'; import '../../core/provider_base.dart'; @@ -23,6 +24,7 @@ import '../store/setting.dart'; class ServerProvider extends BusyProvider { List _servers = []; List get servers => _servers; + final _TryLimiter _limiter = _TryLimiter(); Timer? _timer; @@ -31,18 +33,18 @@ class ServerProvider extends BusyProvider { Future loadLocalData() async { setBusyState(true); final infos = locator().fetch(); - _servers = List.generate(infos.length, (index) => genInfo(infos[index])); + _servers = List.generate(infos.length, (index) => genServer(infos[index])); setBusyState(false); notifyListeners(); } - Server genInfo(ServerPrivateInfo spi) { + Server genServer(ServerPrivateInfo spi) { return Server(spi, initStatus, null, ServerConnectionState.disconnected); } Future refreshData({ServerPrivateInfo? spi}) async { if (spi != null) { - _getData(spi); + await _getData(spi); return; } await Future.wait(_servers.map((s) async { @@ -89,7 +91,7 @@ class ServerProvider extends BusyProvider { } void addServer(ServerPrivateInfo spi) { - _servers.add(genInfo(spi)); + _servers.add(genServer(spi)); locator().put(spi); notifyListeners(); refreshData(spi: spi); @@ -122,6 +124,11 @@ class ServerProvider extends BusyProvider { final state = s.cs; if (state == ServerConnectionState.failed || state == ServerConnectionState.disconnected) { + if (!_limiter.shouldTry(spi.id)) { + s.cs = ServerConnectionState.failed; + notifyListeners(); + return; + } s.cs = ServerConnectionState.connecting; notifyListeners(); final time1 = DateTime.now(); @@ -137,6 +144,7 @@ class ServerProvider extends BusyProvider { if (writeResult.isNotEmpty) { throw Exception(writeResult); } + _limiter.resetTryTimes(spi.id); } catch (e) { s.cs = ServerConnectionState.failed; s.status.failedInfo = '$e ## '; @@ -251,3 +259,20 @@ class ServerProvider extends BusyProvider { return await client.run(snippet.script).string; } } + +class _TryLimiter { + final Map _triedTimes = {}; + + bool shouldTry(String id) { + final times = _triedTimes[id] ?? 0; + if (times >= serverMaxTryTimes) { + return false; + } + _triedTimes[id] = times + 1; + return true; + } + + void resetTryTimes(String id) { + _triedTimes[id] = 0; + } +} \ No newline at end of file diff --git a/lib/data/res/misc.dart b/lib/data/res/misc.dart new file mode 100644 index 00000000..8b37b09e --- /dev/null +++ b/lib/data/res/misc.dart @@ -0,0 +1 @@ +const serverMaxTryTimes = 7; diff --git a/lib/view/page/home.dart b/lib/view/page/home.dart index 3960a591..7f855bf0 100644 --- a/lib/view/page/home.dart +++ b/lib/view/page/home.dart @@ -174,7 +174,7 @@ class _MyHomePageState extends State onPressed: () => showRoundDialog( context, _versionStr, - const Text('${BuildData.buildAt}\n\n${BuildData.engine}'), + const Text(BuildData.buildAt), [], ), child: Text( diff --git a/lib/view/page/server/detail.dart b/lib/view/page/server/detail.dart index 41a34fb8..c8c4b64b 100644 --- a/lib/view/page/server/detail.dart +++ b/lib/view/page/server/detail.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; + import '../../../core/extension/numx.dart'; import '../../../data/model/server/dist.dart'; - import '../../../data/model/server/net_speed.dart'; import '../../../data/model/server/server.dart'; import '../../../data/model/server/server_status.dart'; diff --git a/lib/view/page/server/tab.dart b/lib/view/page/server/tab.dart index eb2c5204..3684e372 100644 --- a/lib/view/page/server/tab.dart +++ b/lib/view/page/server/tab.dart @@ -162,7 +162,7 @@ class _ServerPageState extends State ? GestureDetector( onTap: () => showRoundDialog( context, _s.error, Text(ss.failedInfo ?? ''), []), - child: Text(_s.clickSee, style: style)) + child: Text(_s.clickSee, style: style, textScaleFactor: 1.0,)) : Text(topRightStr, style: style, textScaleFactor: 1.0), const SizedBox(width: 9), _buildSSHBtn(spi), diff --git a/lib/view/page/ssh.dart b/lib/view/page/ssh.dart index 2e5abb59..ec10c9a3 100644 --- a/lib/view/page/ssh.dart +++ b/lib/view/page/ssh.dart @@ -27,7 +27,7 @@ class SSHPage extends StatefulWidget { class _SSHPageState extends State { late final terminal = Terminal(inputHandler: keyboard); - late final SSHClient client; + SSHClient? client; final keyboard = locator(); late MediaQueryData _media; final _virtualKeyboardHeight = 57.0; @@ -49,7 +49,7 @@ class _SSHPageState extends State { @override void dispose() { - client.close(); + client?.close(); super.dispose(); } @@ -59,7 +59,7 @@ class _SSHPageState extends State { client = await genClient(widget.spi); terminal.write('Connected\r\n'); - final session = await client.shell( + final session = await client!.shell( pty: SSHPtyConfig( width: terminal.viewWidth, height: terminal.viewHeight,