Сервер сокета в Dart
Сервер создают через ServerSocket.bind с
номером порта. Обработчик на listen
получает отдельный Socket для обмена с
клиентом, как только тот подключится. Его тоже
закрывают через close.
Входящую строку читают из потока с
LineSplitter. Ответ записывают через
writeln и сразу сбрасывают буфер
flush:
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('echo: $line');
await socket.flush();
await socket.close();
});
var client = await Socket.connect(
InternetAddress.loopbackIPv4,
port,
);
client.writeln('probe');
await client.flush();
var reply = await client
.transform(utf8.decoder)
.transform(const LineSplitter())
.first;
print(reply);
await client.close();
await server.close();
}
Прослушивание порта вешают до вызова
Socket.connect, чтобы в main
осталось место для клиента. Схема та же: порт
0, затем чтение одной строки и ответ:
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('ok: $line');
await socket.flush();
await socket.close();
});
var client = await Socket.connect(
InternetAddress.loopbackIPv4,
port,
);
client.writeln('ready');
await client.flush();
var text = await client
.transform(utf8.decoder)
.transform(const LineSplitter())
.first;
print(text);
await client.close();
await server.close();
}
После строки "ask" от клиента сервер
отвечает "answer: ask"; клиент выводит
эту строку в консоль.
Сервер возвращает клиенту текст "pong",
если получил "ping"; в консоли клиента
должно быть "pong".