Spring boot

RabbitMQ + Spring boot로 Flutter용 채팅 만들기 2

리콜 2023. 6. 9. 17:56

플러터에서 stomp 연결을 하려면 

stomp 라이브러리를 우선 삽입해준다.

 

https://pub.dev/packages/stomp_dart_client

 

stomp_dart_client | Dart Package

Dart STOMP client for easy messaging interoperability. Build with flutter in mind, but should work for every dart application.

pub.dev

 

플러터 터미널에서 

dart pub add stomp_dart_client
or
flutter pub add stomp_dart_client

혹은

pubspec.yaml에서 

dependencies:
  stomp_dart_client: ^0.4.4

하면 된다.

import 'package:stomp_dart_client/parser.dart';
import 'package:stomp_dart_client/sock_js/sock_js_parser.dart';
import 'package:stomp_dart_client/sock_js/sock_js_utils.dart';
import 'package:stomp_dart_client/stomp.dart';
import 'package:stomp_dart_client/stomp_config.dart';
import 'package:stomp_dart_client/stomp_exception.dart';
import 'package:stomp_dart_client/stomp_frame.dart';
import 'package:stomp_dart_client/stomp_handler.dart';
import 'package:stomp_dart_client/stomp_parser.dart';

실행하는 화면 혹은 위젯에서 이렇게 넣고 코딩하면 되고 사용하지 않는 것은 지우면 된다.

 

class _ChatRoomScreenState extends State<ChatRoomScreen> {

  late StompClient stompClient;
   @override
  void initState() {
    super.initState();
    print("웹 소캣 연결");
    connectToStomp();  //stomp 연결
  }
  
  void connectToStomp() {
    stompClient = StompClient(
      config: StompConfig(
        url: 'ws://10.0.2.2:9081/chat', // Spring Boot 서버의 WebSocket URL
        onConnect: onConnectCallback, // 연결 성공 시 호출되는 콜백 함수
      ),
    );

    stompClient.activate();
  }
  void onConnectCallback(StompFrame connectFrame) {
    stompClient.subscribe(
      destination: '/topic/room.abc', // 구독할 주제 경로  abc방을 구독
      callback: (connectFrame){
        print(connectFrame.body);  //메시지를 받았을때!
        // 메시지 처리
      },
    );


  }
  
   @override
  void dispose() {
    stompClient?.deactivate();
   // channel.sink.close();
    super.dispose();
  }
  
  void sendMessage() {
    String message = messageController.text;
    stompClient.send(
      destination: '/app/chat.enter.abc', // Spring Boot 서버의 메시지 핸들러 엔드포인트 경로  abc방에 보낸다
      body: message,
    );
    print("전송!");
    messageController.clear();
  }

 

간단하게 작성한다면 이렇게된다. sendMessage()에서는abc라는 방으로 메시지를 보내고 있다.

 또한 abc방을 구독하고 있기 때문에 메시지를 rabbitMQ에서 뿌린다면 받게 될것이다.

durable이나 autodelete를 조절하여 rabbiqmq의 큐를 계속 살려둘 수도 있다.  

 

만약 원하는 시점에서 stompClient가 stomp에 접속 하게 하고 싶다면 ex)matching 시스템

stompClient를 NULLable로 설정하면 된다. 

다만 이렇게 수행 할시 접속 되지 않아도 문제가 발생하지 않기 때문에 잘 관리 해주어야할 것 같고 다른 방법을 찾아보아야 할 것 같다.

반응형