ZetCode

Dart Socket

最后修改于 2025 年 4 月 4 日

Dart 中的 Socket 类提供了 TCP 网络通信功能。它是 dart:io 库的一部分,支持客户端和服务器网络操作。

Sockets 支持端点之间的双向通信。它们可以通过 TCP/IP 网络传输原始字节或文本数据,并支持各种事件。

基本定义

Socket 表示两个端点之间的 TCP 网络连接。它提供流来异步地读写数据。

主要功能包括事件驱动的数据处理、连接管理以及对 IPv4 和 IPv6 地址的支持。Sockets 与 Streams 一起工作。

基础 Socket 客户端

此示例展示了一个连接到服务器的简单 TCP 客户端。

main.dart
import 'dart:io';

void main() async {
  try {
    var socket = await Socket.connect('localhost', 8080);
    print('Connected to server');
    
    socket.write('Hello from Dart client');
    socket.destroy();
  } catch (e) {
    print('Error: $e');
  }
}

我们创建一个到 localhost 8080 端口的套接字连接。发送消息后,我们关闭连接。错误处理捕获连接问题。

$ dart main.dart
Connected to server

带数据监听的 Socket

此示例演示了从套接字连接读取数据。

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

void main() async {
  var socket = await Socket.connect('example.com', 80);
  
  socket.write('GET / HTTP/1.1\r\nHost: example.com\r\n\r\n');
  
  socket.listen(
    (List<int> data) {
      print(utf8.decode(data));
    },
    onDone: () {
      print('Connection closed');
      socket.destroy();
    }
  );
}

我们连接到一个 Web 服务器并发送一个 HTTP 请求。listen 回调处理传入的数据。完成后连接会自动关闭。

$ dart main.dart
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
...
Connection closed

Socket 服务器

此示例创建了一个简单的 TCP 服务器,用于接受客户端连接。

main.dart
import 'dart:io';

void main() async {
  var server = await ServerSocket.bind('127.0.0.1', 8080);
  print('Server listening on ${server.address}:${server.port}');
  
  server.listen((Socket socket) {
    socket.write('Hello from server!\n');
    socket.close();
  });
}

服务器绑定到 localhost 的 8080 端口。对于每个客户端连接,它会发送一个问候语然后关闭。ServerSocket 管理多个客户端。

$ dart main.dart
Server listening on 127.0.0.1:8080

双向通信

此示例展示了类似聊天的双向套接字通信。

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

void main() async {
  var socket = await Socket.connect('localhost', 8080);
  
  socket.listen(
    (data) => print('Server: ${String.fromCharCodes(data)}'),
    onDone: () => socket.destroy()
  );
  
  var input = stdin.transform(utf8.decoder);
  await for (var message in input) {
    socket.write(message);
  }
}

客户端连接到服务器并监听消息。它还从控制台读取用户输入并将其发送到服务器。UTF-8 处理文本。

$ dart main.dart
Hello
Server: Hi there!
How are you?
Server: I'm fine, thanks!

带超时的 Socket

此示例演示了带超时处理的套接字连接。

main.dart
import 'dart:io';

void main() async {
  try {
    var socket = await Socket.connect('localhost', 8080)
      .timeout(Duration(seconds: 5));
    
    socket.write('Quick message');
    await socket.flush();
    socket.destroy();
    
    print('Message sent successfully');
  } on SocketException catch (e) {
    print('Socket error: $e');
  } on TimeoutException {
    print('Connection timed out');
  }
}

如果连接不成功,连接尝试将在 5 秒后超时。我们分别处理套接字错误和超时异常。

$ dart main.dart
Connection timed out

最佳实践

来源

Dart Socket 文档

本教程介绍了 Dart 的 Socket 类,并提供了实际示例,展示了客户端/服务器通信、数据处理和错误管理。

作者

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

列出 所有 Dart 教程