You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Dart实现与Python等效的TCP服务器数据接收功能?

Dart 实现等效TCP客户端与服务器代码

客户端代码(对应原Python接收逻辑)

以下代码实现与你提供的Python客户端完全相同的功能:建立TCP连接、发送空字节、接收所有数据直到连接关闭、拼接完整数据并关闭连接。

import 'dart:io';
import 'dart:typed_data';

void main() async {
  // 替换为你的目标服务器IP和端口
  const String serverIp = '127.0.0.1';
  const int serverPort = 12345;

  Socket? socket;
  try {
    // 建立TCP连接
    socket = await Socket.connect(serverIp, serverPort);
    
    // 发送空字节数据(对应Python的s.send(b""))
    socket.add(Uint8List(0));
    await socket.flush();

    // 循环接收所有数据块直到连接关闭
    final List<int> allBytes = [];
    await for (final List<int> chunk in socket) {
      allBytes.addAll(chunk);
    }
    // 拼接成完整的字节数据(对应Python的bytes对象)
    final Uint8List squareData = Uint8List.fromList(allBytes);

    // 可在此处处理接收到的数据,例如打印或解析
    print('接收到的完整数据: $squareData');
  } catch (e) {
    print('连接或接收过程出错: $e');
  } finally {
    // 确保连接被关闭
    socket?.close();
    await socket?.done;
  }
}

关键逻辑说明

  • Dart的Socket基于Stream实现,用await for循环可以自动处理数据块的接收,直到服务器主动关闭连接(此时Stream结束)。
  • Uint8List对应Python中的bytes类型,用于存储二进制数据。
  • flush()确保发送的空字节被立即推送至服务器,避免缓存延迟。

服务器代码(对应原Python服务器逻辑)

以下代码实现与你提供的Python服务器一致的功能:绑定端口、监听连接、接受客户端后发送固定二进制数据、关闭连接并循环等待下一个客户端。

import 'dart:io';
import 'dart:typed_data';

void main() async {
  // 替换为你的绑定IP和端口
  const String bindIp = '0.0.0.0';
  const int bindPort = 12345;

  ServerSocket? server;
  try {
    // 绑定地址并启动监听
    server = await ServerSocket.bind(bindIp, bindPort);
    print('TCP服务器已启动,监听地址: $bindIp:$bindPort');

    // 持续接受客户端连接
    await for (final Socket client in server) {
      print('新客户端连接: ${client.remoteAddress.address}:${client.remotePort}');
      try {
        // 发送指定二进制数据(对应Python的b"\x00\x01")
        final Uint8List responseData = Uint8List.fromList([0x00, 0x01]);
        client.add(responseData);
        await client.flush();
      } catch (e) {
        print('向客户端发送数据失败: $e');
      } finally {
        // 关闭与客户端的连接
        client.close();
        await client.done;
        print('客户端连接已关闭');
      }
    }
  } catch (e) {
    print('服务器启动失败: $e');
  } finally {
    // 关闭服务器监听
    server?.close();
    await server?.done;
  }
}

关键逻辑说明

  • ServerSocket.bind()完成端口绑定与监听,返回的ServerSocket也是一个Stream,通过await for处理每个新连接。
  • 每个客户端连接对应一个Socket实例,发送数据后立即关闭连接,与原Python逻辑完全匹配。

内容的提问来源于stack exchange,提问作者Yang_____

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 04:15:43