mirror of
https://github.com/lollipopkit/flutter_server_box.git
synced 2025-12-17 07:14:28 +01:00
server connect: max try 7 times
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
@@ -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
1
lib/data/res/misc.dart
Normal file
@@ -0,0 +1 @@
|
|||||||
|
const serverMaxTryTimes = 7;
|
||||||
@@ -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(
|
||||||
|
|||||||
@@ -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';
|
||||||
|
|||||||
@@ -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),
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user