ZetCode

Dart SocketDirection

最后修改于 2025 年 4 月 4 日

Dart 中的 `SocketDirection` 类表示套接字通信的方向。它与套接字关闭操作一起使用,用于指定是关闭读取、写入还是两个方向。

SocketDirection 是 Dart `dart:io` 库中的一个枚举。它对于网络应用程序中正确的套接字资源管理至关重要。

基本定义

`SocketDirection` 是一个枚举,包含三个值:`receive`、`send` 和 `both`。它们代表套接字的可能通信方向。

该枚举主要用于 `Socket.shutdown()` 方法,以控制套接字上应终止的通信方向。

基本的 SocketDirection 用法

本示例展示了 SocketDirection 在简单 TCP 套接字中的基本用法。

main.dart
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

关闭接收方向

本示例演示了关闭套接字的接收方向。

main.dart
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

关闭两个方向

本示例展示了如何完全关闭套接字的所有方向。

main.dart
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 进行优雅的套接字终止。

main.dart
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 时的正确错误处理。

main.dart
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

最佳实践

来源

Dart SocketDirection 文档

本教程介绍了 Dart 的 SocketDirection 类,并提供了实际示例,展示了如何控制套接字通信方向以进行正确的网络编程。

作者

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

列出 所有 Dart 教程