如何在 Dart http_server 中为单个客户端设置最大连接数限制?
How to set limit for max connection for single client in Dart http_server?
我创建了一个简单的 flutter 应用程序来为我的 phone 目录(/ 的索引)提供服务,以便与 PC 共享我的文件。
(我使用 IDM(Internet 下载管理器)下载文件)
它适用于小文件,但当我将大文件下载到 PC 时,应用程序 自动关闭 。 (这里我尝试下载691MB文件)
因为它创建了 8 个下载连接。
如何在此代码中为单个客户端设置 最大连接限制 ? (比如最多2个连接下载文件)
(使用 HttpServer 和 VirtualDirectory 实现。)
import 'dart:io';
import 'package:http_server/http_server.dart';
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: HomePage(),
);
}
}
HttpServer server;
startServer() async {
// Created VirtualDirectory Variable named staticFiles
VirtualDirectory staticFiles = VirtualDirectory('/storage/emulated/0')
..allowDirectoryListing = true
..jailRoot = false;
// Started the server
server = await HttpServer.bind(InternetAddress.anyIPv4, 7766);
// Serve the directory (Index of/)
server.listen((req) {
staticFiles.serveRequest(req);
});
}
stopServer() {
//Stop the Server
server.close();
}
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Center(
child: Text('Server Test'),
),
),
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
RaisedButton(
child: Text('Start Server'),
onPressed: startServer,
),
RaisedButton(
child: Text('Stop Server'),
onPressed: stopServer,
),
],
),
);
}
}
已安装的依赖项:
dependencies:
http_server: ^0.9.8+3
确保您已启用 READ_EXTERNAL_STORAGE 权限。
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
应用程序在本地网络
上运行
URL=> gatewayIP:7766(很可能 http://192.168.43.1:7766 如果您从 phone 创建一个 wifi 热点并将其连接到 PC)
请帮我解决这个问题。
ps: 当我再次打开应用程序并单击 startServer 时,文件下载恢复。
编辑:我使用 IDM(Internet 下载管理器)下载导致崩溃的文件,但是当我从浏览器下载文件时它工作正常。
我在 dart:io 库中找到 connectionsInfo()
API
从connectionsInfo()
API我们可以得到四种类型的values/properties:Total
,Active
,Idle
,Closeing
see HttpConnectionsInfo Class documentation
要限制最大连接数,我们必须在服务器侦听客户端请求时使用if-else
语句:
...
//_server is an httpServer
_server.listen((req){
int maxConnection = 4;
//if active connections are more than maxConnection than server will not response to any request
if(_server.connectionsInfo().active <= maxConnection){
staticFiles.serveRequest(req);
// Or Your Logic for request response...
}
});
...
我创建了一个简单的 flutter 应用程序来为我的 phone 目录(/ 的索引)提供服务,以便与 PC 共享我的文件。
(我使用 IDM(Internet 下载管理器)下载文件)
它适用于小文件,但当我将大文件下载到 PC 时,应用程序 自动关闭 。 (这里我尝试下载691MB文件)
因为它创建了 8 个下载连接。
如何在此代码中为单个客户端设置 最大连接限制 ? (比如最多2个连接下载文件)
(使用 HttpServer 和 VirtualDirectory 实现。)
import 'dart:io';
import 'package:http_server/http_server.dart';
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: HomePage(),
);
}
}
HttpServer server;
startServer() async {
// Created VirtualDirectory Variable named staticFiles
VirtualDirectory staticFiles = VirtualDirectory('/storage/emulated/0')
..allowDirectoryListing = true
..jailRoot = false;
// Started the server
server = await HttpServer.bind(InternetAddress.anyIPv4, 7766);
// Serve the directory (Index of/)
server.listen((req) {
staticFiles.serveRequest(req);
});
}
stopServer() {
//Stop the Server
server.close();
}
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Center(
child: Text('Server Test'),
),
),
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
RaisedButton(
child: Text('Start Server'),
onPressed: startServer,
),
RaisedButton(
child: Text('Stop Server'),
onPressed: stopServer,
),
],
),
);
}
}
已安装的依赖项:
dependencies:
http_server: ^0.9.8+3
确保您已启用 READ_EXTERNAL_STORAGE 权限。
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
应用程序在本地网络
上运行URL=> gatewayIP:7766(很可能 http://192.168.43.1:7766 如果您从 phone 创建一个 wifi 热点并将其连接到 PC)
请帮我解决这个问题。
ps: 当我再次打开应用程序并单击 startServer 时,文件下载恢复。
编辑:我使用 IDM(Internet 下载管理器)下载导致崩溃的文件,但是当我从浏览器下载文件时它工作正常。
我在 dart:io 库中找到 connectionsInfo()
API
从connectionsInfo()
API我们可以得到四种类型的values/properties:Total
,Active
,Idle
,Closeing
see HttpConnectionsInfo Class documentation
要限制最大连接数,我们必须在服务器侦听客户端请求时使用if-else
语句:
...
//_server is an httpServer
_server.listen((req){
int maxConnection = 4;
//if active connections are more than maxConnection than server will not response to any request
if(_server.connectionsInfo().active <= maxConnection){
staticFiles.serveRequest(req);
// Or Your Logic for request response...
}
});
...