2012-02-23 1 views
1

Можно сделать следующее с AsyncSocket:AsyncSocket: как определить чтение длины и получить обратный вызов только при достижении чтения длины

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

  1. Прочитайте хотя бы первые 5 байт из потока чтения и извлеките из него размер длины ответа «отклик».
  2. Читайте далее до тех пор, пока не будет достигнуто количество байтов, определенное в заголовке «response packet».
  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 

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

ответ

1

Найдено решение. Вам нужно позвонить 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: будет называться.

+1

Эй вы знаете, как определить размер пакета ответа? или Должен ли я делать предположение о размере? благодаря –