Если вы хотите сделать это без сторонних библиотек,
тогда вы можете использовать функцию CFStreamCreatePairWithSocketToHost для создания входных и выходных потоков (объект сокета не требуется).
Вот пример кода для настройки
И поиск показывает еще много
В iOS вы не можете сразу писать или читать потоки, вам нужно подождать, пока сокет не будет подключен, и вы получите разрешение на чтение / запись. Это делается путем реализации NSStreamDelegate .
Если вы получили событие NSStreamEventHasSpaceAvailable, вы можете записать свою строку в выходной поток. Вам не нужен PrintWriter, чтобы просто написать строку, потому что легко преобразовать NSString в NSData и записать NSData.
Если вы получаете событие NSStreamEventHasBytesAvailable, это означает, что вы можете попытаться прочитать данные из входного потока в некоторый буфер (например, NSMutableData). Нет встроенного BufferedReader с методом readLine, поэтому вам придется самостоятельно буферизовать данные и определить, когда там появляется символ новой строки. После этого вы можете вырезать часть буфера до новой строки и преобразовать NSData в NSString (или объект JSON с помощью NSJSONSerialization ).
Примечание: вызовы scheduleInRunLoop могут показаться запутанными, но они необходимы для начала приема событий через делегата. Это как бы сообщает системе, в каком потоке вы хотите их получить.
P.S. Я согласен с комментаторами, что если у вас есть контроль над кодом сервера, лучше использовать стандартный протокол, такой как Socket IO или msgpack , а не придумывать свой собственный, потому что они лучше и лучше поддержка библиотек и более широкого сообщества.