Как создать пару NSInputStream/NSOutputStream, приняв сокет сервера?
Я знаю, что вы можете создать NSInputStream
а также NSOutputStream
пара (бесплатный звонок соединен с CFReadStream
, CFWriteStream
), открыв TCP-соединение клиента, используя CFStreamCreatePairWithSocketToHost
в соответствии с Руководством по программированию потока.
Как создать TCP- сервер, который прослушивает порт и принимает соединение как NSInputStream
а также NSOutputStream
пара?
2 ответа
Пример проекта RemoteCurrency предоставляет пример этого в QServer.m (ранее известный как TCPServer.m). Пример кода на самом деле предназначен для настройки рекламы Bonjour, но эта часть может быть исключена для простого TCP-сервера.
Вы создаете сокет с вашим собственным обратным вызовом, вызывая CFSocketCreate
, связать и прослушать порт, позвонив CFSocketSetAddress
и начать получать ответные вызовы, позвонив CFSocketCreateRunLoopSource
с последующим CFRunLoopAddSource
,
Затем в обратном вызове принятия вы создаете NSInputStream
/ NSOutputStream
пара из ручки подключения с помощью CFStreamCreatePairWithSocket
, установите делегат входного потока и начните получать обратные вызовы recv, вызывая scheduleInRunLoop:forMode:
, а потом open
оба потока, чтобы начать использовать их.
Использование абстракций NSInputStream и NSOutputStream (в отличие от создания нового потока и вызова стандартных функций UNIX socket
, bind
, listen
, accept
, send
, recv
) позволяет легко получать сетевые события в том же NSRunLoop, что и остальные API на основе цикла выполнения в OSX.
У меня есть пример приложения, которое вы можете скачать, который создает пару NSStreams, подключенных через сокет. Затем он передает потоковое видео в режиме реального времени через разъемы с помощью камеры на устройстве iOS:
Код является лаконичным и простым в использовании (игнорируйте дополнительные файлы в проекте; NavController.h/m и PeerConnectionViewController.h/m и CameraViewController.h/m являются единственными тремя соответствующими файлами):