소개
웹 소켓은 실시간 통신을 제공하는 프로토콜로서, 클라이언트와 서버 간 양방향 통신을 가능하게 합니다. 플러터에서도 웹 소켓을 이용하여 실시간 통신을 구현할 수 있습니다. 이 글에서는 플러터에서 웹 소켓 통신을 구현하는 방법에 대해 알아보겠습니다.
웹 소켓 통신 라이브러리
플러터에서 웹 소켓 통신을 구현하기 위해 다양한 라이브러리를 사용할 수 있습니다. 여기서는 가장 널리 사용되는 web_socket_channel
라이브러리를 사용하여 구현하는 방법을 알아보겠습니다.
세팅하기
먼저, 프로젝트의 pubspec.yaml
파일에 web_socket_channel
의존성을 추가해야 합니다:
dependencies:
web_socket_channel: ^2.0.0
그 다음, pub get
명령어를 실행하여 의존성을 다운로드 받아야 합니다.
웹 소켓 연결하기
web_socket_channel
라이브러리를 이용하여 웹 소켓에 연결할 수 있습니다. 다음은 연결하는 예제 코드입니다:
import 'package:web_socket_channel/io.dart';
import 'package:web_socket_channel/web_socket_channel.dart';
void main() {
final channel = IOWebSocketChannel.connect('ws://localhost:8080');
channel.sink.add('Hello!');
channel.stream.listen((message) {
print('Received: $message');
});
channel.sink.close();
}
위 코드에서 IOWebSocketChannel.connect()
메서드를 사용하여 웹 소켓에 연결합니다. 연결된 소켓은 channel
변수에 저장됩니다. channel.sink
는 송신을 위한 스트림이며, channel.stream
은 수신을 위한 스트림입니다. 이때, channel.sink.add()
메서드를 사용하여 메시지를 전송할 수 있습니다.
웹 소켓 통신 예제
웹 소켓 통신의 원리를 이해하기 위해 예제를 살펴보겠습니다. 서버 측에서는 클라이언트로부터 메시지를 수신하고, 해당 메시지를 클라이언트에게 다시 전송하는 단순한 에코 서버를 구현해보겠습니다. 먼저 서버 측에서의 코드입니다:
import 'dart:io';
void main() {
serve().then((_) => print('Server started!'));
Future<void> serve() async {
final server = await HttpServer.bind('localhost', 8080);
print('Listening on ${server.address}:${server.port}');
await for (HttpRequest request in server) {
if (WebSocketTransformer.isUpgradeRequest(request)) {
WebSocketTransformer.upgrade(request).then((WebSocket socket) {
socket.listen((message) {
print('Received: $message');
socket.add('Echo: $message');
});
}).catchError((_) => print('Error'));
} else {
request.response.statusCode = HttpStatus.forbidden;
request.response.reasonPhrase = 'WebSockets only';
await request.response.close();
}
}
}
}
위 코드는 HttpServer
를 생성하고, 클라이언트로부터 웹 소켓 연결을 받아들이는 에코 서버를 구현한 예제입니다. 클라이언트로부터 받은 메시지를 다시 클라이언트에게 전송하는 에코 기능을 수행합니다.
이제 클라이언트 측에서의 코드를 살펴보겠습니다:
import 'package:web_socket_channel/io.dart';
import 'package:web_socket_channel/web_socket_channel.dart';
void main() {
final channel = IOWebSocketChannel.connect('ws://localhost:8080');
channel.stream.listen((message) {
print('Received: $message');
channel.sink.add('Hello, server!');
});
}
위 코드는 서버에 연결하여 해당 서버로부터 메시지를 수신하고, 받은 메시지를 출력한 뒤 다시 서버에게 메시지를 전송하는 예제입니다.
결론
플러터에서 웹 소켓 통신을 구현하는 방법에 대해 알아보았습니다. web_socket_channel
라이브러리를 이용하여 손쉽게 웹 소켓 통신을 구현할 수 있습니다. 웹 소켓을 이용하면 효율적이고 실시간 통신이 가능하므로, 실시간 알림, 채팅 등 다양한 기능을 구현할 수 있습니다.
더 많은 내용은 아래 참고 자료를 참고해주세요:
web_socket_channel
라이브러리: https://pub.dev/packages/web_socket_channel- 플러터 공식 문서: https://flutter.dev/docs
- 웹 소켓 프로토콜: https://developer.mozilla.org/en-US/docs/WebSockets/Writing_WebSocket_servers