Dart SocketDirection
最后修改于 2025 年 4 月 4 日
Dart 中的 `SocketDirection` 类表示套接字通信的方向。它与套接字关闭操作一起使用,用于指定是关闭读取、写入还是两个方向。
SocketDirection 是 Dart `dart:io` 库中的一个枚举。它对于网络应用程序中正确的套接字资源管理至关重要。
基本定义
`SocketDirection` 是一个枚举,包含三个值:`receive`、`send` 和 `both`。它们代表套接字的可能通信方向。
该枚举主要用于 `Socket.shutdown()` 方法,以控制套接字上应终止的通信方向。
基本的 SocketDirection 用法
本示例展示了 SocketDirection 在简单 TCP 套接字中的基本用法。
import 'dart:io';
void main() async {
var server = await ServerSocket.bind('localhost', 0);
var client = await Socket.connect('localhost', server.port);
// Shutdown only the send direction
client.shutdown(SocketDirection.send);
print('Send direction shutdown');
server.close();
}
我们创建了一个服务器套接字和一个客户端套接字,然后在客户端上仅关闭发送方向。在此调用之后,服务器仍然可以向客户端发送数据。
$ dart main.dart Send direction shutdown
关闭接收方向
本示例演示了关闭套接字的接收方向。
import 'dart:io';
void main() async {
var server = await ServerSocket.bind('localhost', 0);
var client = await Socket.connect('localhost', server.port);
// Shutdown only the receive direction
client.shutdown(SocketDirection.receive);
print('Receive direction shutdown');
server.close();
}
关闭接收方向后,客户端仍然可以发送数据,但不会接收任何传入数据。这对于单向通信很有用。
$ dart main.dart Receive direction shutdown
关闭两个方向
本示例展示了如何完全关闭套接字的所有方向。
import 'dart:io';
void main() async {
var server = await ServerSocket.bind('localhost', 0);
var client = await Socket.connect('localhost', server.port);
// Shutdown both directions
client.shutdown(SocketDirection.both);
print('Both directions shutdown');
server.close();
}
使用 `SocketDirection.both` 关闭套接字上的所有通信。这相当于调用 `Socket.close()`,但更明确。
$ dart main.dart Both directions shutdown
优雅的套接字终止
本示例演示了使用 SocketDirection 进行优雅的套接字终止。
import 'dart:io';
void main() async {
var server = await ServerSocket.bind('localhost', 0);
var client = await Socket.connect('localhost', server.port);
// First shutdown sending to indicate we're done writing
client.shutdown(SocketDirection.send);
// Then wait for server to finish sending
await server.first;
// Finally shutdown completely
client.shutdown(SocketDirection.both);
server.close();
print('Graceful termination complete');
}
此模式确保在关闭之前传输所有待处理数据。首先我们停止发送,然后等待另一方完成,最后完全关闭。
$ dart main.dart Graceful termination complete
带 SocketDirection 的错误处理
本示例展示了使用 SocketDirection 时的正确错误处理。
import 'dart:io';
void main() async {
try {
var socket = await Socket.connect('google.com', 80);
// Attempt to shutdown a direction
socket.shutdown(SocketDirection.send);
print('Shutdown successful');
socket.close();
} on SocketException catch (e) {
print('Socket error: ${e.message}');
} catch (e) {
print('Unexpected error: $e');
}
}
我们将套接字操作包装在 try-catch 块中以处理潜在的错误。如果套接字已关闭,SocketDirection 操作可能会失败。
$ dart main.dart Shutdown successful
最佳实践
- 显式关闭: 使用 SocketDirection 进行清晰的通信终止
- 优雅关闭: 如果可能,首先关闭发送方向
- 错误处理: 始终处理潜在的套接字错误
- 资源清理: 确保套接字已正确关闭
来源
本教程介绍了 Dart 的 SocketDirection 类,并提供了实际示例,展示了如何控制套接字通信方向以进行正确的网络编程。
作者
列出 所有 Dart 教程。