Обмен в одном запуске в Dart
Полный цикл в одном процессе: обработчик на
listen ждет клиента, основной поток
открывает Socket на loopback и номер из
server.port. Сначала клиент пишет строку,
затем читает ответ - порядок важен, иначе стороны
ждут друг друга.
Ответ сервера попадает в консоль через
print на клиенте после чтения строки из
потока с LineSplitter:
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());
await input.first;
socket.writeln('status: done');
await socket.flush();
await socket.close();
});
var client = await Socket.connect(
InternetAddress.loopbackIPv4,
port,
);
client.writeln('go');
await client.flush();
var reply = await client
.transform(utf8.decoder)
.transform(const LineSplitter())
.first;
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 line = await input.first;
socket.writeln('heard: $line');
await socket.flush();
await socket.close();
});
var client = await Socket.connect(
InternetAddress.loopbackIPv4,
port,
);
client.writeln('wave');
await client.flush();
var text = await client
.transform(utf8.decoder)
.transform(const LineSplitter())
.first;
print(text);
await client.close();
await server.close();
}
Клиент отправляет "start" и печатает
ответ "begin: start", который формирует
сервер.
В консоли клиента после обмена должна быть строка
"ok", если сервер получил "check".