gpt4 book ai didi

sockets - 在 Dart 中向套接字数据写入/读取字节数

转载 作者:行者123 更新时间:2023-12-02 13:08:39 27 4
gpt4 key购买 nike

在以下服务器/客户端套接字代码中,服务器尝试发送从 0 到 1023 的整数。客户端收到正确数量的整数,但它们在 255 处换行。这是为什么以及正确的方法是什么?

* 服务器 *

import 'dart:async';
import 'dart:io';

main() async {
final server = await ServerSocket.bind('127.0.0.1', 4041);
server.listen((Socket socket) {
print('Got connected ${socket.remoteAddress}');
for(int i=0; i<1024; i++) {
socket.add([i]);
}
socket.close();
print('Closed ${socket.remoteAddress}');
});
}

* 客户端 *

import 'dart:async';
import 'dart:io';

main() async {
final client = await Socket.connect('127.0.0.1', 4041);
client.listen(
(var data) => print('Got $data'),
onDone: () { print('Done'); client.close(); },
onError: (e) { print('Got error $e'); client.close(); });
print('main done');
}

此外,感觉 Socket api 有点不同——它支持以流方式读取的方式比其他语言更加 Dartish。但是如果您只想读取 N 个字节怎么办?你如何实现这一目标?我看到 take 方法 (Stream take(int count)),但我不清楚 count 到底采用了什么,特别是在术语方面已读取了多少字节。因为 Socket 实现了 Stream< List < int >> 并且因为 int 并不是真正的固定大小的实体(我认为??),你怎么知道已经读取了多少字节?

最佳答案

需要澄清的一件事是,尽管 dart:io 中的大多数方法操作List<int> Dart 中所有 IO 的基本假设是这些列表是字节值列表。文档可能对此并不那么精确。

这意味着您可以使用任何 List发送字节时您喜欢的实现 - 包括类型化数据,例如

var socket = ...
socket.add([1, 2, 3]);
socket.add(new List<int>.generate(3, (int index) => index * index);
socket.add('ASCII'.codeUnits);
socket.add(UTF8.encode('Søren'));

var typedData = new Uint8List(8);
var data = new ByteData.view(typedData.buffer);
data.setInt32(0, 256 * 256 - 1);
data.setInt32(4, 256 * 256 - 1, Endianness.LITTLE_ENDIAN);
socket.add(typedData)

当从套接字接收数据时,数据在 Socket 上传递流是从操作系统传送的字节 block 。您无法预测当时收到了多少字节。如果您希望能够读取特定数量的字节,一种选择是实现一个字节读取器,其方法如下:

Future<List<int>> read(int numBytes);

然后可以使用 List<int> 的流来初始化该字节读取器。并处理框架。您可以做的是拥有一个缓冲区(也许使用 BytesBuilder 中的 dart:io ),它在收到数据时收集数据。当read称为 Future当有足够的字节可用时完成。这样的字节读取器还可以在缓冲数据量达到一定限制时暂停流,并在读取数据时再次恢复流。

关于sockets - 在 Dart 中向套接字数据写入/读取字节数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29081144/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com