Ответ
Да, я использовал WebSocket для реализации функций реального времени, таких как чаты и live-обновления данных. Во Flutter для этого обычно применяется пакет web_socket_channel.
Основной паттерн работы:
- Установить соединение с сервером.
- Слушать входящие сообщения через
Stream. - Отправлять данные через
Sink. - Корректно обрабатывать закрытие соединения и ошибки.
Пример реализации простого клиента:
import 'package:web_socket_channel/web_socket_channel.dart';
import 'package:web_socket_channel/io.dart';
class WebSocketService {
late WebSocketChannel _channel;
Stream get stream => _channel.stream;
void connect(String url) {
_channel = IOWebSocketChannel.connect(Uri.parse(url));
// Слушаем сообщения
_channel.stream.listen(
(message) => _handleMessage(message),
onError: (error) => _handleError(error),
onDone: () => _handleDisconnection(),
);
}
void send(String data) {
if (_channel.closeCode == null) {
_channel.sink.add(data);
}
}
void _handleMessage(dynamic message) {
// Логика обработки сообщения (например, парсинг JSON)
print('Received: $message');
}
void dispose() {
_channel.sink.close();
}
}
Ключевые моменты из практики:
- Управление состоянием соединения: Важно отслеживать статус (
connecting,connected,disconnected) и показывать его пользователю. - Переподключение: Реализуется через
retryлогику с экспоненциальной задержкой, например, с помощью пакетаasync. - Сериализация: Для сложных данных используется
jsonEncode/jsonDecode. Для бинарных данных можно использоватьUint8List. - Socket.IO: Для проектов, где сервер использует Socket.IO, применяется пакет
socket_io_client, который требует другой подход к обработке событий и комнат.