ZetCode

Dart HttpConnectionInfo

最后修改于 2025 年 4 月 4 日

Dart 中的 HttpConnectionInfo 类提供了关于 HTTP 服务器连接的信息。它在服务器端 Dart 应用程序中可用。

此类公开了远程和本地地址、端口号以及连接是否安全等详细信息。它是 Dart 的 dart:io 库的一部分。

基本定义

HttpConnectionInfo 是一个描述 HTTP 连接的接口。它通常从 HttpRequest 对象中获得。

主要属性包括远程和本地套接字地址、端口号和安全状态。这些信息对于日志记录和安全很有用。

基本的 HttpConnectionInfo 用法

本示例展示了如何访问基本的连接信息。

main.dart
import 'dart:io';

void main() async {
  var server = await HttpServer.bind('localhost', 8080);
  print('Server running on ${server.port}');
  
  await for (var request in server) {
    var connInfo = request.connectionInfo;
    print('Remote address: ${connInfo.remoteAddress.address}');
    print('Remote port: ${connInfo.remotePort}');
    request.response.write('Hello from server!');
    await request.response.close();
  }
}

我们创建一个 HTTP 服务器并访问每个请求的连接信息。remoteAddress 和 remotePort 属性显示客户端连接详细信息。

$ dart main.dart
Server running on 8080
Remote address: ::1
Remote port: 54321

检查安全连接

本示例演示了如何检查连接是否安全。

main.dart
import 'dart:io';

void main() async {
  var server = await HttpServer.bind('localhost', 8080);
  
  await for (var request in server) {
    var connInfo = request.connectionInfo;
    var secure = connInfo.secure ? 'SECURE' : 'NOT SECURE';
    
    request.response.write('''
      Connection Info:
      - Secure: $secure
      - Protocol: ${connInfo.protocol}
      - Local Address: ${connInfo.localAddress.address}
    ''');
    
    await request.response.close();
  }
}

我们检查 secure 属性以确定连接是否使用 HTTPS。protocol 属性显示正在使用的传输协议。

$ dart main.dart
Connection Info:
- Secure: NOT SECURE
- Protocol: null
- Local Address: ::1

记录连接详细信息

本示例展示了如何记录全面的连接信息。

main.dart
import 'dart:io';

void logConnection(HttpConnectionInfo info) {
  print('''
  New Connection:
  - Remote: ${info.remoteAddress.address}:${info.remotePort}
  - Local: ${info.localAddress.address}:${info.localPort}
  - Secure: ${info.secure}
  - Protocol: ${info.protocol ?? 'HTTP'}
  ''');
}

void main() async {
  var server = await HttpServer.bind('localhost', 8080);
  
  await for (var request in server) {
    logConnection(request.connectionInfo);
    request.response.write('Logged your connection!');
    await request.response.close();
  }
}

我们创建一个专用的日志记录函数来处理连接信息。这种模式对于监控和调试服务器应用程序非常有用。

$ dart main.dart
New Connection:
- Remote: ::1:54321
- Local: ::1:8080
- Secure: false
- Protocol: HTTP

处理多个连接

本示例展示了如何使用唯一 ID 跟踪多个连接。

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

final random = Random();

String generateConnectionId(HttpConnectionInfo info) {
  return '${info.remoteAddress.address}-${info.remotePort}-${random.nextInt(1000)}';
}

void main() async {
  var server = await HttpServer.bind('localhost', 8080);
  var connections = <String, int>{};
  
  await for (var request in server) {
    var id = generateConnectionId(request.connectionInfo);
    connections[id] = (connections[id] ?? 0) + 1;
    
    request.response.write('''
      Connection ID: $id
      Visit count: ${connections[id]}
      Total connections: ${connections.length}
    ''');
    
    await request.response.close();
  }
}

我们使用地址、端口和随机数为每个连接生成唯一 ID。这允许跟踪与服务器的individual 客户端交互。

$ dart main.dart
Connection ID: ::1-54321-42
Visit count: 1
Total connections: 1

安全服务器示例

本示例演示了 HttpConnectionInfo 与安全 HTTPS 服务器的结合使用。

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

Future<SecurityContext> getSecurityContext() async {
  var context = SecurityContext();
  // In production, use real certificates
  context.useCertificateChain('path/to/cert.pem');
  context.usePrivateKey('path/to/key.pem');
  return context;
}

void main() async {
  var context = await getSecurityContext();
  var server = await HttpServer.bindSecure(
    'localhost', 
    443, 
    context,
  );
  
  await for (var request in server) {
    var connInfo = request.connectionInfo;
    request.response.write('''
      Secure Connection Info:
      - Protocol: ${connInfo.protocol}
      - Cipher: ${connInfo.cipherName}
      - Bits: ${connInfo.cipherBits}
    ''');
    await request.response.close();
  }
}

对于安全服务器,HttpConnectionInfo 提供了额外的 TLS 详细信息。protocol、cipherName 和 cipherBits 属性显示了加密信息。

$ dart main.dart
Secure Connection Info:
- Protocol: TLSv1.3
- Cipher: AES_256_GCM
- Bits: 256

最佳实践

来源

Dart HttpConnectionInfo 文档

本教程通过实际示例介绍了 Dart 的 HttpConnectionInfo 类,展示了如何在服务器应用程序中访问和利用 HTTP 连接信息。

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。到目前为止,我已撰写了 1400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出 所有 Dart 教程