Как GCDAsyncSocket определил конец входящего сообщения
Легко понять, что мы можем использовать следующие способы определения конца входящего сообщения, например: 1. Помещение длины сообщения перед самими данными 2. Использование разделителя
Тем не менее, GCDAsyncSocket предоставляет более комплексное / интеллектуальное / общее решение. И кажется, что он использует протокол TCP низкого уровня для определения начала и конца сообщения.
Как это сделать?
1 ответ
GCDAsyncSocket просто использует потоки TCP. Потоки TCP по своей природе не определяют "сообщения", они, как следует из названия, являются просто потоками байтов.
GCDAsyncSocket добавляет несколько удобных методов, чтобы вам было проще
readDataToLength:withTimeout:tag:
и связанные методы автоматически завершают чтение, когда заданное количество байтов было получено - это можно использовать с первым вариантом, который вы упомянули.readDataToData:withTimeout:tag:
которые позволяют вам указать последовательность терминаторов и автоматически завершить чтение при получении - это второй вариант, который вы упомянули.
В TCP нет ничего, что поддерживало бы эти функции как таковые, авторы GCDAsyncSocket просто внедрили эти решения поверх необработанного потока.