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 |