Dart HttpConnectionInfo
最后修改于 2025 年 4 月 4 日
Dart 中的 HttpConnectionInfo 类提供了关于 HTTP 服务器连接的信息。它在服务器端 Dart 应用程序中可用。
此类公开了远程和本地地址、端口号以及连接是否安全等详细信息。它是 Dart 的 dart:io 库的一部分。
基本定义
HttpConnectionInfo 是一个描述 HTTP 连接的接口。它通常从 HttpRequest 对象中获得。
主要属性包括远程和本地套接字地址、端口号和安全状态。这些信息对于日志记录和安全很有用。
基本的 HttpConnectionInfo 用法
本示例展示了如何访问基本的连接信息。
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
检查安全连接
本示例演示了如何检查连接是否安全。
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
记录连接详细信息
本示例展示了如何记录全面的连接信息。
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 跟踪多个连接。
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 服务器的结合使用。
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
最佳实践
- 日志记录:为安全审计记录连接信息
- 验证:检查远程地址以进行访问控制
- 性能:谨慎访问 connectionInfo
- 安全:尽可能优先使用安全连接
来源
本教程通过实际示例介绍了 Dart 的 HttpConnectionInfo 类,展示了如何在服务器应用程序中访问和利用 HTTP 连接信息。
作者
列出 所有 Dart 教程。