2014-10-18 1 views
0

Легко понять, что мы можем использовать следующие способы идентификации конца входящего сообщения, например: 1. Ввод длины сообщения перед самими данными 2. Использование разделителяКак GCDAsyncSocket идентифицировал конец входящего сообщения

Однако GCDAsyncSocket обеспечивает более полное/разумное/общее решение. Похоже, что он использует протокол TCP низкого уровня для определения начала и конца сообщения.

Как это сделать?

ответ

1

GCDAsyncSocket использует только потоки TCP. Потоки TCP по сути не определяют «сообщения», они, как следует из названия, просто потоки байтов.

GCDAsyncSocket добавляет некоторые удобные методы, чтобы сделать вещи немного проще для вас

  • readDataToLength:withTimeout:tag: и связанных с ними методов автоматического завершения чтения, когда заданное количество байт было получено - Это может быть использовано с первым вариантом вы упоминается.
  • readDataToData:withTimeout:tag:, которые позволяют вам указывать последовательность терминатора и автоматически считывать считывание при его получении. Это второй вариант, который вы упомянули.

Для поддержки этих функций, как таковых, ничего не существует, поэтому авторы GCDAsyncSocket просто реализовали эти решения поверх необработанного потока.

+0

Большое спасибо. Мой вопрос в том, как GCDAsyncSocket знает, когда заканчивается сообщение, если есть два последовательных сообщения. «Сепаратор» определяется сервером и GCDAsyncSocket как общее решение, очевидно, не знает, что такое «Сеператор». – ikzjfr0

+0

Вы должны указать разделитель/терминатор в своем обращении к 'readDataToData' – Paulw11

+0

Вы правы, так большое спасибо за вашу помощь – ikzjfr0