ZetCode

Dart HttpConnectionsInfo

最后修改于 2025 年 4 月 4 日

Dart 中的 HttpConnectionsInfo 类提供有关活动 HTTP 服务器连接的信息。它是 dart:io 库的一部分。

此类可深入了解服务器性能和连接管理。它对于监视和调试 HTTP 服务器应用程序非常有用。

基本定义

HttpConnectionsInfo 是一个只读类,其中包含有关 HTTP 服务器连接的统计信息。它通常通过 HttpServer 访问。

关键属性包括活动连接数、空闲连接数和总连接数。这些指标有助于了解服务器负载。

基本的 HttpConnectionsInfo 用法

此示例显示了如何从服务器访问基本的连接信息。

main.dart
import 'dart:io';

void main() async {
  var server = await HttpServer.bind('localhost', 8080);
  
  server.listen((request) {
    var info = server.connectionsInfo();
    print('Active connections: ${info.active}');
    request.response.write('Hello');
    request.response.close();
  });
}

我们创建一个 HTTP 服务器并在请求期间访问连接信息。active 属性显示当前正在处理的连接。

$ dart main.dart
Active connections: 1

监视连接统计信息

此示例演示了定期监视连接统计信息。

main.dart
import 'dart:io';
import 'dart:async';

void main() async {
  var server = await HttpServer.bind('localhost', 8080);
  
  Timer.periodic(Duration(seconds: 5), (timer) {
    var info = server.connectionsInfo();
    print('''
    Active: ${info.active}
    Idle: ${info.idle}
    Total: ${info.total}''');
  });
  
  server.listen((request) {
    request.response.write('Monitoring');
    request.response.close();
  });
}

我们使用周期性计时器每 5 秒记录一次连接统计信息。这有助于跟踪服务器随时间的负载模式。

$ dart main.dart
    Active: 0
    Idle: 1
    Total: 1

执行连接限制

此示例演示了如何使用 HttpConnectionsInfo 实现连接限制。

main.dart
import 'dart:io';

void main() async {
  var server = await HttpServer.bind('localhost', 8080);
  const maxConnections = 10;
  
  server.listen((request) {
    var info = server.connectionsInfo();
    
    if (info.total >= maxConnections) {
      request.response.statusCode = 503;
      request.response.write('Server busy');
    } else {
      request.response.write('Processing');
    }
    
    request.response.close();
  });
}

我们在处理每个请求之前检查总连接数。如果达到限制,我们将返回 503 Service Unavailable 响应。

$ dart main.dart

连接池分析

此示例分析了负载下的连接池行为。

main.dart
import 'dart:io';
import 'dart:async';

void main() async {
  var server = await HttpServer.bind('localhost', 8080);
  
  server.listen((request) async {
    var info = server.connectionsInfo();
    print('Before: Active=${info.active} Idle=${info.idle}');
    
    await Future.delayed(Duration(seconds: 2));
    request.response.write('Delayed response');
    await request.response.close();
    
    info = server.connectionsInfo();
    print('After: Active=${info.active} Idle=${info.idle}');
  });
}

我们在请求处理期间跟踪连接状态更改。延迟响应显示了连接如何在状态之间转换。

$ dart main.dart
Before: Active=1 Idle=0
After: Active=0 Idle=1

服务器运行状况检查端点

此示例使用连接信息创建了一个运行状况检查端点。

main.dart
import 'dart:io';
import 'dart:convert';

void main() async {
  var server = await HttpServer.bind('localhost', 8080);
  
  server.listen((request) {
    if (request.uri.path == '/health') {
      var info = server.connectionsInfo();
      var health = {
        'active': info.active,
        'idle': info.idle,
        'total': info.total,
        'status': info.active < 50 ? 'OK' : 'WARN'
      };
      request.response.headers.contentType = ContentType.json;
      request.response.write(jsonEncode(health));
    } else {
      request.response.write('Main endpoint');
    }
    request.response.close();
  });
}

我们通过 JSON 运行状况端点公开连接统计信息。这对于监视系统检查服务器状态非常有用。

$ curl https://:8080/health
{"active":1,"idle":0,"total":1,"status":"OK"}

最佳实践

来源

Dart HttpConnectionsInfo 文档

本教程通过实际示例介绍了 Dart 的 HttpConnectionsInfo 类,展示了监视、负载管理和运行状况检查功能。

作者

我的名字是 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出 所有 Dart 教程