Клиент сокета в Dart
Клиентская сторона открывает соединение через
Socket.connect: первый аргумент - адрес,
второй - номер порта, на котором уже слушает
сервер. Объект Socket закрывают через
close после обмена.
Текст на сервер передают в сокет. Метод
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());
await input.first;
await socket.close();
});
var client = await Socket.connect(
InternetAddress.loopbackIPv4,
port,
);
client.writeln('client line');
await client.flush();
await client.close();
await server.close();
}
Сервер в фоне лишь принимает соединение и читает
строку - это заготовка для проверки клиента. Адрес
InternetAddress.loopbackIPv4 и порт из
server.port совпадают с теми, что выбрал
ServerSocket в том же запуске:
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 text = await input.first;
print('server got: $text');
await socket.close();
});
var client = await Socket.connect(
InternetAddress.loopbackIPv4,
port,
);
client.writeln('note from client');
await client.flush();
await client.close();
await server.close();
}
В одном запуске клиент отправляет строку
"ping", сервер печатает ее с префиксом
"got: " в консоли.
Строка "alpha" уходит с клиента на
loopback; на стороне сервера в консоли должно
появиться "alpha" без изменений.