server connect: max try 7 times

This commit is contained in:
lollipopkit
2023-02-01 13:34:45 +08:00
parent 04cf5b65ce
commit 2faea10d61
7 changed files with 41 additions and 11 deletions

View File

@@ -15,7 +15,11 @@ List<SSHKeyPair> loadIndentity(String key) {
} }
Future<SSHClient> genClient(ServerPrivateInfo spi) async { Future<SSHClient> 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) { if (spi.pubKeyId == null) {
return SSHClient( return SSHClient(
socket, socket,

View File

@@ -2,6 +2,7 @@ import 'dart:async';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:toolbox/data/res/misc.dart';
import '../../core/extension/uint8list.dart'; import '../../core/extension/uint8list.dart';
import '../../core/provider_base.dart'; import '../../core/provider_base.dart';
@@ -23,6 +24,7 @@ import '../store/setting.dart';
class ServerProvider extends BusyProvider { class ServerProvider extends BusyProvider {
List<Server> _servers = []; List<Server> _servers = [];
List<Server> get servers => _servers; List<Server> get servers => _servers;
final _TryLimiter _limiter = _TryLimiter();
Timer? _timer; Timer? _timer;
@@ -31,18 +33,18 @@ class ServerProvider extends BusyProvider {
Future<void> loadLocalData() async { Future<void> loadLocalData() async {
setBusyState(true); setBusyState(true);
final infos = locator<ServerStore>().fetch(); final infos = locator<ServerStore>().fetch();
_servers = List.generate(infos.length, (index) => genInfo(infos[index])); _servers = List.generate(infos.length, (index) => genServer(infos[index]));
setBusyState(false); setBusyState(false);
notifyListeners(); notifyListeners();
} }
Server genInfo(ServerPrivateInfo spi) { Server genServer(ServerPrivateInfo spi) {
return Server(spi, initStatus, null, ServerConnectionState.disconnected); return Server(spi, initStatus, null, ServerConnectionState.disconnected);
} }
Future<void> refreshData({ServerPrivateInfo? spi}) async { Future<void> refreshData({ServerPrivateInfo? spi}) async {
if (spi != null) { if (spi != null) {
_getData(spi); await _getData(spi);
return; return;
} }
await Future.wait(_servers.map((s) async { await Future.wait(_servers.map((s) async {
@@ -89,7 +91,7 @@ class ServerProvider extends BusyProvider {
} }
void addServer(ServerPrivateInfo spi) { void addServer(ServerPrivateInfo spi) {
_servers.add(genInfo(spi)); _servers.add(genServer(spi));
locator<ServerStore>().put(spi); locator<ServerStore>().put(spi);
notifyListeners(); notifyListeners();
refreshData(spi: spi); refreshData(spi: spi);
@@ -122,6 +124,11 @@ class ServerProvider extends BusyProvider {
final state = s.cs; final state = s.cs;
if (state == ServerConnectionState.failed || if (state == ServerConnectionState.failed ||
state == ServerConnectionState.disconnected) { state == ServerConnectionState.disconnected) {
if (!_limiter.shouldTry(spi.id)) {
s.cs = ServerConnectionState.failed;
notifyListeners();
return;
}
s.cs = ServerConnectionState.connecting; s.cs = ServerConnectionState.connecting;
notifyListeners(); notifyListeners();
final time1 = DateTime.now(); final time1 = DateTime.now();
@@ -137,6 +144,7 @@ class ServerProvider extends BusyProvider {
if (writeResult.isNotEmpty) { if (writeResult.isNotEmpty) {
throw Exception(writeResult); throw Exception(writeResult);
} }
_limiter.resetTryTimes(spi.id);
} catch (e) { } catch (e) {
s.cs = ServerConnectionState.failed; s.cs = ServerConnectionState.failed;
s.status.failedInfo = '$e ## '; s.status.failedInfo = '$e ## ';
@@ -251,3 +259,20 @@ class ServerProvider extends BusyProvider {
return await client.run(snippet.script).string; return await client.run(snippet.script).string;
} }
} }
class _TryLimiter {
final Map<String, int> _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;
}
}

1
lib/data/res/misc.dart Normal file
View File

@@ -0,0 +1 @@
const serverMaxTryTimes = 7;

View File

@@ -174,7 +174,7 @@ class _MyHomePageState extends State<MyHomePage>
onPressed: () => showRoundDialog( onPressed: () => showRoundDialog(
context, context,
_versionStr, _versionStr,
const Text('${BuildData.buildAt}\n\n${BuildData.engine}'), const Text(BuildData.buildAt),
[], [],
), ),
child: Text( child: Text(

View File

@@ -1,8 +1,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import '../../../core/extension/numx.dart'; import '../../../core/extension/numx.dart';
import '../../../data/model/server/dist.dart'; import '../../../data/model/server/dist.dart';
import '../../../data/model/server/net_speed.dart'; import '../../../data/model/server/net_speed.dart';
import '../../../data/model/server/server.dart'; import '../../../data/model/server/server.dart';
import '../../../data/model/server/server_status.dart'; import '../../../data/model/server/server_status.dart';

View File

@@ -162,7 +162,7 @@ class _ServerPageState extends State<ServerPage>
? GestureDetector( ? GestureDetector(
onTap: () => showRoundDialog( onTap: () => showRoundDialog(
context, _s.error, Text(ss.failedInfo ?? ''), []), 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), : Text(topRightStr, style: style, textScaleFactor: 1.0),
const SizedBox(width: 9), const SizedBox(width: 9),
_buildSSHBtn(spi), _buildSSHBtn(spi),

View File

@@ -27,7 +27,7 @@ class SSHPage extends StatefulWidget {
class _SSHPageState extends State<SSHPage> { class _SSHPageState extends State<SSHPage> {
late final terminal = Terminal(inputHandler: keyboard); late final terminal = Terminal(inputHandler: keyboard);
late final SSHClient client; SSHClient? client;
final keyboard = locator<VirtualKeyboard>(); final keyboard = locator<VirtualKeyboard>();
late MediaQueryData _media; late MediaQueryData _media;
final _virtualKeyboardHeight = 57.0; final _virtualKeyboardHeight = 57.0;
@@ -49,7 +49,7 @@ class _SSHPageState extends State<SSHPage> {
@override @override
void dispose() { void dispose() {
client.close(); client?.close();
super.dispose(); super.dispose();
} }
@@ -59,7 +59,7 @@ class _SSHPageState extends State<SSHPage> {
client = await genClient(widget.spi); client = await genClient(widget.spi);
terminal.write('Connected\r\n'); terminal.write('Connected\r\n');
final session = await client.shell( final session = await client!.shell(
pty: SSHPtyConfig( pty: SSHPtyConfig(
width: terminal.viewWidth, width: terminal.viewWidth,
height: terminal.viewHeight, height: terminal.viewHeight,