프로그래밍/flutter

[flutter] 소켓 통신 응답받을때 데이터 짤리는 문제

소행성왕자 2023. 8. 8. 17:08

flutter 에서 소켓 접속후 응받받을때 데이터가 짤리는경우가 발생한다.

수정전

Future<void> _listenToSocket() async {
    _socket.listen(
          (List<int> data) async {
            // 데이터 수신 처리
            _hexString = HEX.encode(data);
            print('flutter 에서 데이터 수신');
            print(_hexString);

        // 비동기 작업을 수행하고자 하는 경우, await 키워드로 Future를 기다릴 수 있습니다.
        await someAsyncTask();
        // 비동기 작업 후 추가적인 코드
      },
      onError: (e) {
        print('Socket error: $e');
        _disconnect();
      },
      onDone: () {
        print('Socket disconnected');
        _disconnect();
      },
      cancelOnError: false,
    );
  }

수정후

Future<void> _listenToSocket() async {
    // 데이터를 받을 버퍼를 초기화
    List<int> buffer = [];
    _socket.listen(
      (List<int> data) async {
        // 받은 데이터를 버퍼에 추가
        buffer.addAll(data);

        // 전체 데이터 길이 정보가 도착한 경우
        if (buffer.length >= 4) {
          /**
           * 전체 데이터 길이를 얻음
           * buffer[0], buffer[1], buffer[2], buffer[3] 각각은 1바이트 크기의 정수 값입니다. buffer 배열의 첫 4바이트를 나타냅니다.
              << 연산자는 비트를 왼쪽으로 이동시키는 연산입니다. buffer[0] << 24는 buffer[0]의 비트를 왼쪽으로 24비트 이동시킨 값을 의미합니다.
              마찬가지로 buffer[1] << 16, buffer[2] << 8, buffer[3]은 각각 비트를 왼쪽으로 16, 8, 0비트 이동시킨 값을 나타냅니다.
              | 연산자는 비트별 OR 연산을 수행합니다. 위의 네 개의 이동 연산을 수행한 결과를 비트별 OR 연산하여 하나의 정수 값으로 합쳐줍니다.
           */
          int length = (buffer[0] << 24) | (buffer[1] << 16) | (buffer[2] << 8) | buffer[3];

          // 버퍼에 모든 데이터가 도착한 경우
          if (buffer.length >= length + 4) {
            // 데이터를 추출하고 사용
            List<int> receivedData = buffer.sublist(0, length + 4);
            _hexString = HEX.encode(receivedData);
            print('flutter 에서 데이터 수신');
            print(_hexString);

            // 사용한 데이터는 버퍼에서 삭제
            buffer.removeRange(0, length + 4);

            // 비동기 작업을 수행하고자 하는 경우, await 키워드로 Future를 기다릴 수 있습니다.
            await someAsyncTask();
            // 비동기 작업 후 추가적인 코드
          }
        }
      },
      onError: (e) {
        print('Socket error: $e');
        _disconnect();
      },
      onDone: () {
        print('Socket disconnected');
        _disconnect();
      },
      cancelOnError: false,
    );
  }