Несколько сообщений в Dart
Одно TCP-соединение может передать несколько строк подряд: каждая заканчивается переводом строки, как при одиночной отправке. Сервер читает в цикле с ограничением по числу строк или пока клиент не закроет сокет.
Две строки отправляют подряд через writeln,
затем сбрасывают буфер и читают столько же ответов
из потока ввода клиента:
import 'dart:io';
import 'dart:convert';
void main() async {
var server = await ServerSocket.bind(
InternetAddress.loopbackIPv4,
0,
);
var port = server.port;
server.listen((socket) async {
var input = socket
.transform(utf8.decoder)
.transform(const LineSplitter());
var count = 0;
await for (var line in input) {
socket.writeln('ack: $line');
await socket.flush();
count++;
if (count >= 2) {
break;
}
}
await socket.close();
});
var client = await Socket.connect(
InternetAddress.loopbackIPv4,
port,
);
client.writeln('one');
client.writeln('two');
await client.flush();
var replies = client
.transform(utf8.decoder)
.transform(const LineSplitter())
.take(2);
await for (var reply in replies) {
print(reply);
}
await client.close();
await server.close();
}
Сервер может только печатать принятые строки, пока не получит заданное число сообщений. Клиент закрывает сокет после отправки:
import 'dart:io';
import 'dart:convert';
void main() async {
var server = await ServerSocket.bind(
InternetAddress.loopbackIPv4,
0,
);
var port = server.port;
server.listen((socket) async {
var input = socket
.transform(utf8.decoder)
.transform(const LineSplitter());
var count = 0;
await for (var line in input) {
count++;
print('line $count: $line');
if (count >= 2) {
break;
}
}
await socket.close();
});
var client = await Socket.connect(
InternetAddress.loopbackIPv4,
port,
);
client.writeln('part-0');
client.writeln('part-1');
await client.flush();
await client.close();
await server.close();
}
Три строки "a", "b", "c"
уходят с клиента; сервер печатает каждую с
префиксом "item: ", затем клиент
закрывает сокет.
Клиент после трех строк "n1", "n2",
"n3" читает три ответа "got n1",
"got n2", "got n3" и выводит их
в консоль.