Asyncsocket: Получение объединения двух пакетов вместо отдельных двух пакетов
-
28-10-2019 - |
Вопрос
Я выполняю 4 команды запуска, а также ожидаю получить 4 ответа. Сервер уже реализован, и еще один разработчик, который разрабатывает Android, способен получать эти 4 отдельных ответа, однако я получаю 2 хороших ответа (отдельные), а затем 3 -й и 4 -й ответы в качестве одного ответа. Я поместил NSLOG NSDATA привести к завершению, и он выводит мне объединенный пакет "0106000000000B0600000000" вместо отдельных пакетов "010600000000" и "0B060000000000". Я также проверил эти 3 -й и 4 -й команды по отдельности (только по одному за раз), и все в порядке с сервером, он отправляет их отдельно, однако происходит слияние (с 3 -м и 4 -м), если все четыре команды выполняются в линии Анкет Любые идеи?
ОБНОВЛЕНИЕ: Я думаю, что я проследил до проблем с проблемами. Есть звонок, который считывает данные пакетов из потока в методе Dobytesavailable:
CFIndex result = [self readIntoBuffer:subBuffer maxLength:bytesToRead];
И в redhintobuffer: maxlength, есть звонок (длина == 256):
return CFReadStreamRead(theReadStream, (UInt8 *)buffer, length);
Таким образом, CFReadStreamRead возвращает неверную длину пакета - он возвращает длину 12 (вместо 6), а также получает объединенные данные. HM, что может привести к тому, что CFReadStreamRead читает два пакета в один, вместо того, чтобы читать их отдельно ...
Update2: я использую Onsocket: DidReadData: WithTag: Delegate Method и ожидаю получить данные ответа с помощью тега запроса, который я выполнил. Недавно я понял, что потоки - это потоки, не пакеты, а как я могу решить это? Ответы на сервере не имеют прекращения ChARS в начале и окончании ответа, только размер ответа, который составляет 2 - 5 байтов. Я могу сократить первую часть ответа (первый пакет) и проигнорировать вторую часть, но как асинксакет сделает еще один обратный вызов со второй частью ответа (второй пакет)? Если я вырезаю только первые части и проигнорирую вторую, то IMHO будет потерян второй «пакет» ...
Как сократить первую часть ответа и сказать Asyncsocket, чтобы сделать еще один обратный вызов с тегом и второй части ответа в качестве отдельного обратного вызова?
Update3: В Onsocket: DidReadData: WithTag:, я вручную вырезал объединенный ответ, обрабатываю первую часть (первый пакет), а затем в конце бросал вызов Onsocket: DidReadData: WithTag: Опять: снова:
if (isMergedPacket) {
...
[self onSocket:sock didReadData:restPartOfTheResponse withTag:myCommandTag];
}
Тем не менее, он выглядит как сами асинксакет сочетает каждый пакет запросов с пакетом ответов (через класс Asyncreadpacket) с использованием тегов. Итак, моя ручная резка работает, но Asyncocket не знает, что я уже обрабатывал оба пакета, и он все еще пытается прочитать второй пакет. Итак, я получаю ноз: должен время, когда вы можете получить время, не завершается.
Решение
Найдено решение. Нет необходимости меняться и копаться в асинксокете. Вам просто нужно определить продолжительность каждого ответа - сколько байтов вы заинтересованы в чтении и получении обратного вызова. Больше информации вы можете на другом сообщении здесь