AsyncSocket: как определить длину чтения и получить обратный вызов только при достижении длины чтения - PullRequest
1 голос
/ 23 февраля 2012

Можно ли сделать следующее с AsyncSocket:

в то время как («ответный пакет» не читается) делать {

  1. Чтение по крайней мере первых 5 байтов из потока чтения,и извлеките из этого размер длины «ответного пакета».
  2. Читайте дальше, пока не будет достигнуто количество считанных байтов, определенных в заголовке «ответного пакета».
  3. Если достигнут конец потока чтения, но некоторые байты являютсяне хватает, затем дождитесь другого потока чтения и затем завершите чтение «ответного пакета».
  4. Скопируйте прочитанные байты в буфер и пометьте эти считанные данные как данные «ответного пакета».
  5. Выполните обратный вызов для моегоделегировать onSocket: didReadData: withTag: с этими данными.
  6. очистить буфер (ответный пакет) и выполнить те же действия со следующими потоками чтения.

}

Вотмое текущее использование AsyncSocket:

Я пишу данные через сокет с AsyncSocket:

[_socket writeData:request withTimeout:commandData tag:commandTag];

и получаю обратный вызов в моем классе делегата:

onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag

Проблема в том, что нет терминадобавление char в поток данных и единственный способ определить длину передаваемых «ответных пакетов» - это прочитать и проанализировать их первые 5 байтов и использовать их для вырезания данных в «пакеты» и выполнения обратных вызовов моему делегату.В настоящее время я использую AsyncSocket, как показано во фрагменте кода выше, и некоторые обратные вызовы «onSocket: didReadData: withTag:» уже представляют собой пакеты данных хорошей длины (полученные NSData), но некоторые объединены.ИМХО Мне нужно явно указать AsyncSocket, как интерпретировать и разрезать поступающие данные в пакеты при чтении.

1 Ответ

1 голос
/ 01 марта 2012

Нашел решение. Вам нужно вызвать onSocket: didWriteDataWithTag: в методе делегата AsyncSocket:

- (void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag {

   ...
  [sock readDataToLength:<preferred size of response packet> withTimeout:myTimeout tag:tag];

  //instead of
  //[sock readDataWithTimeout:myTimeout tag:tag];
}

Таким образом, вы определяете, когда будет вызываться onSocket: didReadData: withTag:.

...