2012-02-20 8 views
0

4 개의 시작 명령을 실행 중이고 4 개의 응답을받을 것으로 예상됩니다. 서버가 이미 구현되었고 안드로이드를 개발중인 다른 개발자가 4 가지 별도의 응답을받을 수 있지만 2 가지 좋은 응답 (분리)을 얻었고 3 회 및 4 회 응답이 하나의 응답으로 나타납니다. NSC의 NSLog 결과를 completeCurrentRead에 두었고, 별도의 패킷 "010600000000"과 "0b0600000000"대신에 병합 된 패킷 "0106000000000b0600000000"을 출력합니다. 또한 세 번째와 네 번째 명령을 분리하여 테스트했는데 (한 번에 하나씩) 서버에서 모든 것이 OK 일 때 별도로 보냈지 만 네 개의 명령이 모두 한 줄로 실행되면 병합이 발생합니다 (세 번째와 네 번째). . 어떤 아이디어?AsyncSocket : 별도의 두 패킷 대신 두 개의 패킷 병합

업데이트 : 문제의 뿌리를 추적 한 것 같습니다.

CFIndex result = [self readIntoBuffer:subBuffer maxLength:bytesToRead]; 

을 그리고 readIntoBuffer에서 : doBytesAvailable 방법에 스트림에서 패킷 데이터를 읽고 전화있다 최대 길이는 전화 (길이 == 256)있다 : 그래서

return CFReadStreamRead(theReadStream, (UInt8 *)buffer, length); 

이 CFReadStreamRead 잘못된 길이를 반환 패킷의 길이는 12 (6 대신)의 길이를 반환하며 병합 된 데이터를 가져옵니다. 흠, CFReadStreamRead가 두 개의 패킷을 개별적으로 읽는 대신 한 패킷으로 읽는 원인이 될 수 있습니다 ...

UPDATE2 : onSocket : didReadData : withTag : 위임 메서드를 사용하고 요청 태그가있는 응답 데이터를 수신 할 것으로 예상됩니다. 나는 공연했다. 최근에 스트림을 알게되었습니다. 스트림이 아니라 패킷이 아니라 어떻게 해결할 수 있습니까? 서버 응답에는 응답의 시작과 끝에서 종료 문자가 없으며 응답 크기는 2-5 바이트입니다. 응답 (첫 번째 패킷)의 첫 번째 부분을 자르고 두 번째 부분을 무시할 수 있지만 AsyncSocket이 두 번째 부분 (두 번째 패킷)과 함께 다른 콜백을 수행하는 방법은 무엇입니까? 첫 번째 부분 만 잘라내어 두 번째 IMHO를 무시하면 두 번째 "패킷"이 손실됩니다 ...

응답의 첫 번째 부분을 잘라내어 태그와 함께 다른 콜백을 수행하도록 AsyncSocket에 지시하고 두 번째 부분 콜백으로서의 응답?

갱신 3 : onSocket에서 : didReadData는 : didReadData : withTag : 다시 :

if (isMergedPacket) { 
    ... 
[self onSocket:sock didReadData:restPartOfTheResponse withTag:myCommandTag]; 
} 
withTag :, 내가 수동으로 잘라 병합 반응은 onSocket에 대한 호출을 던지고, 마지막에 다음 첫 번째 부분 (첫 번째 패킷) 및 처리

그러나 AsyncSocket 자체는 모든 요청 패킷을 태그를 사용하여 응답 패킷 (AsyncReadPacket 클래스를 통해)과 쌍으로 처리합니다. 따라서 수동 절단은 작동하지만 AsyncSocket은 두 패킷을 이미 처리했는지 알지 못하고 두 번째 패킷을 읽으려고합니다. 그래서, 나는 양말을 얻고있다 : shouldTimeoutReadWithTag : ... read 작업이 완료되지 않고 타임 아웃에 도달했을 때 호출되는 콜백.

답변

0

발견 된 솔루션. AsyncSocket을 변경하고 파고 할 필요는 없습니다. 각 응답 길이를 정의 할 필요가 있습니다. 콜백을 읽거나 가져 오는 데 얼마나 많은 바이트가 필요합니까? 다른 게시물에 대한 추가 정보 here