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, ); }
'프로그래밍 > flutter' 카테고리의 다른 글
[flutter] native(앱) 의 웹뷰(vue3) 양방향 통신 방법 InAppWebView 사용 (0) | 2023.08.11 |
---|---|
소켓통신 첫 4byte 길이 구하기 (비트연산) (0) | 2023.08.10 |
[flutter] native(앱) 의 웹뷰(vue3) 양방향 통신 방법 webview_flutter 사용 (0) | 2023.08.08 |
[flutter] native 와 webview 양방향 통신 방법 (0) | 2023.08.04 |
flutter json -> object 로 변경 jsonDecode 사용 (0) | 2023.08.04 |