Интеграция WebSocket с Flutter: Использование WebSocket для приложений в реальном времени
FlutterPulseЭта статья переведена специально для канала FlutterPulse. В этом канале вы найдёте много интересных вещей, связанных с Flutter. Не забывайте подписываться! 🚀

Разработка мобильных приложений часто требует использования новых технологий и методов для улучшения пользовательского опыта и повышения производительности приложения…
Разработка мобильных приложений часто требует использования новых технологий и методов для улучшения пользовательского опыта и повышения производительности приложения. Одной из этих технологий является WebSocket. WebSocket — это протокол, который часто используется для удовлетворения требований к реальному времени связи.
Что такое WebSocket?
WebSocket — это протокол, который обеспечивает двунаправленную связь с низкой задержкой. Похоже на HTTP, WebSocket позволяет передавать данные между клиентом и сервером. Однако, в отличие от HTTP, после установления соединения WebSocket создается непрерывный канал между двумя сторонами. Это позволяет в реальном времени передавать данные между клиентом и сервером.
Для чего используется WebSocket?
WebSocket идеален для следующих сценариев:
- Приложения в реальном времени: Используется в приложениях, требующих быстрой передачи и получения данных, таких как живой чат, уведомления, игры или финансовые приложения.
- Требования к низкой задержке: WebSocket идеален для приложений, требующих низкой задержки. Это критично для сценариев, где пользователю требуется немедленная обратная связь.
- Требования к непрерывному соединению: WebSocket более эффективен для приложений, требующих непрерывного соединения для передачи данных. Например, в приложении для чата сообщения должны доставляться получателю немедленно.
Преимущества WebSocket
- Низкая задержка: WebSocket обеспечивает низкую задержку, так как соединение остается открытым, и данные передаются мгновенно.
- Двунаправленная связь: WebSocket позволяет двунаправленную связь между клиентом и сервером. Это позволяет обеим сторонам отправлять данные.
- Эффективное использование данных: Поскольку WebSocket поддерживает непрерывное соединение, нет необходимости открывать новое соединение каждый раз, что снижает сетевой трафик и время.
Интеграция WebSocket в проект Flutter
Для использования WebSocket в Flutter сначала нужен сервер WebSocket, который можно создать с помощью технологий, таких как Node.js. С стороны Flutter мы будем использовать пакет web_socket_channel для управления соединением WebSocket.

Настройка сервера WebSocket с использованием Node.js
При использовании Flutter в качестве клиента WebSocket мы можем настроить сервер с помощью Node.js. Node.js — отличная платформа для создания серверов WebSocket. Мы будем использовать популярный пакет Node.js ws для создания сервера WebSocket.
Шаг 1: Настройка сервера WebSocket с использованием Node.js
Сначала убедитесь, что Node.js и npm установлены в вашей системе. Если они не установлены, вы можете скачать и установить их с официального сайта Node.js.
Создайте новый проект Node.js и установите необходимые пакеты:
mkdir websocket-server cd websocket-server npm init -y npm install ws
Пакет ws используется для создания сервера WebSocket. Теперь напишите следующий код, чтобы запустить сервер:
// server.js
const WebSocket = require('ws');
const server = new WebSocket.Server({ port: 8080 });
server.on('connection', (ws) => {
console.log('Новый клиент подключился!');
// Слушаем сообщения от клиента
ws.on('message', (message) => {
console.log('Получено сообщение: ', message);
// Отправляем сообщение обратно (функция эха)
ws.send(`Сообщение от сервера: ${message}`);
});
// Отправляем приветственное сообщение клиенту
ws.send('Добро пожаловать на сервер WebSocket!');
});
console.log('Сервер WebSocket работает на порту 8080...');
Этот код создает сервер WebSocket, который слушает входящие подключения клиентов. Он принимает сообщения от клиента и отправляет их обратно (функция эха). Сервер работает на порту 8080.
Шаг 2: Запуск сервера
Чтобы запустить сервер, выполните следующую команду в терминале:
node server.js
Как только сервер запустится, он начнет прослушивание на ws://localhost:8080.
Интеграция WebSocket в проект Flutter
На стороне Flutter мы будем использовать пакет web_socket_channel для управления соединением WebSocket.
Шаг 1: Установка пакета WebSocket Channel
Чтобы добавить поддержку WebSocket в ваш проект Flutter, сначала добавьте пакет web_socket_channel в файл pubspec.yaml.
dependencies:
flutter:
sdk: flutter
web_socket_channel: ^lastest_version
Шаг 2: Настройка соединения WebSocket
Чтобы сделать соединение WebSocket более чистым и управляемым, мы создадим сервисный класс, который обрабатывает соединение, отправку и получение сообщений.
import 'package:web_socket_channel/web_socket_channel.dart';
class WebSocketService {
final WebSocketChannel channel;
WebSocketService(String url) : channel = WebSocketChannel.connect(Uri.parse(url));
// Отправить сообщение
void sendMessage(String message) {
if (message.isNotEmpty) {
channel.sink.add(message);
}
}
// Слушать входящие сообщения
Stream get messages => channel.stream;
// Закрыть соединение
void close() {
channel.sink.close();
}
}
Этот сервисный класс запускает соединение WebSocket, отправляет сообщения и слушает входящие сообщения. Метод close используется для закрытия соединения.
Шаг 3: Использование соединения WebSocket в интерфейсе Flutter
Теперь давайте создадим виджет Flutter, который использует сервис WebSocket для отображения сообщений и позволяет пользователю их отправлять.
import 'package:flutter/material.dart';
import 'package:web_socket_channel/web_socket_channel.dart';
class WebSocketService {
final WebSocketChannel channel;
WebSocketService(String url) : channel = WebSocketChannel.connect(Uri.parse(url));
// Отправить сообщение в WebSocket
void sendMessage(String message) {
if (message.isNotEmpty) {
channel.sink.add(message);
}
}
// Поток для прослушивания входящих сообщений
Stream get messages => channel.stream;
// Закрыть соединение WebSocket
void close() {
channel.sink.close();
}
}
class WebSocketExample extends StatefulWidget {
@override
_WebSocketExampleState createState() => _WebSocketExampleState();
}
class _WebSocketExampleState extends State<WebSocketExample> {
late WebSocketService _webSocketService;
final TextEditingController _controller = TextEditingController();
@override
void initState() {
super.initState();
// Инициализация соединения WebSocket
_webSocketService = WebSocketService('ws://localhost:8080');
}
@override
void dispose() {
// Закрыть соединение WebSocket при удалении виджета
_webSocketService.close();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text("Пример WebSocket")),
body: Column(
children: [
Expanded(
child: StreamBuilder(
stream: _webSocketService.messages,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return Center(child: CircularProgressIndicator());
}
if (snapshot.hasError) {
return Center(child: Text('Ошибка: ${snapshot.error}'));
}
return ListView(
children: [
Text(snapshot.hasData ? '${snapshot.data}' : 'Данные еще не получены'),
],
);
},
),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
children: [
Expanded(
child: TextField(
controller: _controller,
decoration: const InputDecoration(labelText: 'Введите сообщение'),
),
),
IconButton(
icon: const Icon(Icons.send),
onPressed: () {
// Отправить сообщение при нажатии на кнопку
_webSocketService.sendMessage(_controller.text);
_controller.clear();
},
),
],
),
),
],
),
);
}
}
Это приложение Flutter позволяет пользователю ввести сообщение, отправить его через WebSocket и увидеть ответ сервера на экране.
Заключение
Интеграция WebSocket с Flutter — это отличное решение для передачи данных в реальном времени и приложений с низкой задержкой. Следуя шагам, изученным в этой статье, вы можете реализовать коммуникацию через WebSocket в своем приложении Flutter для мгновенного обмена данными. Вы можете дополнительно улучшить свою реализацию WebSocket, добавив функции, такие как управление сессиями, обработка ошибок и меры безопасности.