flutter - 如何在 Dart http_server 中设置单个客户端的最大连接数限制?
问题描述
我创建了一个简单的颤振应用程序来提供我的电话目录(/ 的索引)以与 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(如果您从手机创建 wifi 热点并将其连接到 PC,则很可能是http://192.168.43.1:7766 )
请帮我解决这个问题。
ps:当我再次打开应用程序并单击startServer时,文件下载会恢复。
编辑:我使用 IDM(Internet 下载管理器)下载导致崩溃的文件,但是当我过去从浏览器下载文件时它工作正常。
解决方案
我connectionsInfo()
在 dart:io 库中找到了 API
从connectionsInfo()
API 我们可以访问四种类型的值/属性:Total
, Active
, Idle
,Closeing
请参阅 HttpConnectionsInfo 类文档
为了限制最大连接,我们必须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...
}
});
...
推荐阅读
- f# - F# 将状态传递给 Bind 中的函数
- javascript - 我正在开发一个 youtube 音频播放器,就像来自 discord 的 Rythm/Groovy。我几乎没有其他功能,比如下载音频文件。[不工作]]
- kotlin - Micronaut gradle 测试不工作,说每个端口都已经绑定
- angular - Angular:使用观察选项时的请求标头问题
- reactjs - react-select scrollintoView 不滚动选中的值
- mysql - 使用 Sequelize 的一对多关系创建的外键比预期的要多
- google-sheets - 如何使用单个按钮更新所有使用 Data Connector for Salesforce Add-on 的工作表?
- django - 没有找到任何参数的 Django Reverse 进行“编辑”
- sql-server - 使用带有版本控制的 MVC .net 更新 SQL Server 数据库架构
- javascript - Javascript -> symfony 控制器请求