Используя сокеты и потоки сокета
В этой главе описываются способы сделать сокетные соединения, полностью являющиеся объектом управления Вашей программы. Большинство программ было бы лучше вручено высокоуровневым APIs такой как NSURLConnection
, который был описан в предыдущих главах. Этот APIs должен использоваться, только если необходимо поддерживать некоторый протокол кроме протоколов, поддерживаемых встроенным Какао или Базовой функциональностью Основы.
Выбор сокета API
На почти каждом уровне сетей программное обеспечение может быть разделено на две категории: клиенты (программы, соединяющиеся с другими приложениями) и службы (программы, которые другие приложения подключают с). На высоком уровне эти строки ясны. Большинство программ записанный использующий высокоуровневый APIs является просто клиентами. На более низком уровне, однако, строки являются часто расплывчатыми.
Сокет и поток, программирующий обычно, попадают в одну из следующих широких категорий:
Основанная на пакете коммуникация — Программы, воздействующие на один пакет за один раз, прислушиваясь к входящим пакетам, затем отправляя пакеты в ответ.
С основанной на пакете коммуникацией единственными различиями между клиентами и серверами является содержание пакетов, которые каждая программа отправляет и получает, и (по-видимому) что каждая программа делает с данными. Сам сетевой код идентичен.
Клиенты на основе потоков — Программы, использующие TCP, чтобы отправить и получить данные как два непрерывных потока байтов, один в каждом направлении.
С коммуникацией на основе потоков клиенты и серверы несколько более отличны. Фактическая часть обработки данных клиентов и серверов подобна, но способ, которым программа первоначально создает канал передачи, очень отличается.
API, который Вы выбираете для основанных на сокете соединений, зависит от того, делаете ли Вы соединение с другим узлом или получаете соединение от другого узла. Это также зависит от того, используете ли Вы TCP или некоторый другой протокол. Вот несколько факторов для рассмотрения:
В OS X, если у Вас уже есть сетевой код, совместно использующийся с платформами не-Apple, можно использовать POSIX C сетевой APIs и продолжать использовать сетевой код как есть (на отдельном потоке). Если Ваша программа основывается на Базовой Основе или Какао (Основа) выполненный цикл, можно также использовать Базовую Основу
CFStream
API для интеграции сетевого кода POSIX в полную архитектуру на основном потоке. Также при использовании Grand Central Dispatch (GCD) можно добавить сокет как источник отгрузки.В iOS обескураживают сетям POSIX, потому что они не активируют сотовую радиосвязь или по требованию VPN. Таким образом, как правило, необходимо разделить сетевой код от любых общих данных, обрабатывающих функциональность, и переписать сетевой код с помощью высокоуровневого APIs.
Для демонов и служб, слушающих на порту, или для несоединений TCP, POSIX использования или Базовой Основы (
CFSocket
) C сетевой APIs.Для клиентского кода в Objective C используйте Objective C Основы, объединяющий APIS В СЕТЬ. Основа определяет высокоуровневые классы для управления соединениями URL, потоками сокета, сетевыми службами и другими сетевыми задачами. Это - также основная платформа Objective C неUI в OS X и iOS, обеспечивая подпрограммы для выполненных циклов, строковой обработки, объектов коллекции, доступа к файлу, и т.д.
Для клиентского кода в C используйте Базовую Основу C сетевой APIs — часть платформы CFNetwork. Базовая платформа Основы и платформа CFNetwork являются двумя из основных платформ языка C в OS X и iOS. Вместе они определяют функции и структуры, на которых Основа создаются сетевые классы.
Узнавать больше
Чтобы узнать больше, как использовать сокеты и потоки сокета, читайте Используя Потоки Сокета и Сокеты.