마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 소켓 통신 시에 데이터의 무결성?

0 추천
socket_in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
data = socket_in.readLine();

 

송신 장비에서 대략 1초에 한번 씩 1000 length 의 데이터를 반복적으로 보내주고 있습니다.

위 코드처럼 readLine 해서 읽어 보면 1000 length의 데이터가 들어와야 하는데,

처음 받아서 읽어본 데이터의 길이는 100 정도로 시작하고 몇번 더 읽어보면 1000 length의 데이터를 받다가

어느 순간에는 500, 800, 100 처럼 흔들릴 때도 있고, 안정적으로 1000씩 받아서 읽어올 때도 있습니다.

그래서 데이터의 길이가 1000이 아니면 패스하고 1000일 때만 프로그램에 반영하는 식으로 했는데,

값이 좀 흔들리면 한동안 패스만 계속해서 공백이 생기더군요.

좀 더 안정적으로 데이터를 수신하고 읽어들일 수 있는 방법이 있을까요?

 

보내는쪽에서 규칙적으로 1초에 1000씩 보내주고 있는데

받는쪽에서 1000이 아닌 값을 읽는것은 와이파이 소켓 통신시에 데이터 손실로 봐야 하는 걸까요?

아니면 송신측과 수신측이 싱크? 가 안맞아서 이런 현상이 생기는걸까요?

 

안정적으로 수신할 수 있는 방법이 있을지 궁금합니다.

다른분들은 어떤식으로 코딩하시는지 궁금합니다.

 

 

익명사용자 님이 2016년 5월 18일 질문

1개의 답변

0 추천
readLine()은 버퍼 크기나 전송 크기에 따라 읽어주는 메소드가 아닙니다. API 확인하시면 알 수 있으실거구요.

뜻 그대로 한줄을 읽는 메소드이기 때문에 JAVA로 '\n'(줄바꿈, 엔터)이 들어오면 거기서 끊어 읽습니다.

즉 이런 현상이 발생한건 아마 중간의 데이터 중 char형으로 읽었을때 '\n'에 해당하는 바이트들을 이따금씩 발견하는거겠죠.

readLine() 대신에 일반적인 read()를 쓰시고 버퍼 크기를 원하는대로 설정하셔서 구현하세요.

byte[] buf = new byte[1000];
data = new String(socket_in.read(buf));
Jinthree (8,980 포인트) 님이 2016년 5월 18일 답변
Jinthree님이 2016년 5월 18일 수정
...