如何在 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...
        
    }
});
...