如何用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_____
相关产品推荐
相关产品推荐

