Подтвердить что ты не робот

Использование сокетов в Swift, как в Java

Если бы я хотел подключиться к серверу, в Java я бы открыл Socket и инициализировал его с адресом порта и хоста, а затем извлекал потоки ввода/вывода и читал/записывал все, что захочу.

В Swift мне сложно делать это, так как он не построен таким образом, и мне бы очень хотелось увидеть простой пример того, как подключиться к серверу, получить потоки и использовать их.

EDIT1:

Это проверенный код после ссылки на @Grimxn.

var host = "http://google.com"
var readStream :CFReadStreamRef
var writeStream :CFWriteSteamRef
var socket = CFStreamCreatePairWithSocketToHost(nil, host, 80, readStream, writeStream)

Основные проблемы:

  • Инициализация двух потоков выше также требует использования CFAllocator, о котором я ничего не знаю. Использование kCFAllocatorDefault не помогло, те же ошибки.

  • Приведенный выше код возвращает эту ошибку: Невозможно преобразовать тип выражения 'Void' для ввода UInt32.

  • Когда я создаю UInt32 с помощью UInt32 (80), например, ошибка: Не удалось найти перегрузку для 'init', которая принимает предоставленный аргумент.

Я ценю любую помощь!

4b9b3361

Ответ 1

Я сам это понял, для тех, кто ищет объяснения, читаемые впереди;

Существует несколько способов использования Sockets для связи с локальным приложением или удаленным сервером.

Проблема, описанная в исходном сообщении, заключалась в том, чтобы получить потоки ввода/вывода и заставить их работать. (В конце этого сообщения есть ссылка на другое сообщение, объясняющее, как использовать эти потоки)

Класс NSStream имеет статический метод (функция класса в swift), называемый getStreamsToHost. Все, что вам нужно подготовить, - это NSHost, инициализированный с реальным адресом хоста, номером порта, ссылкой на объект NSInputStream obj, а также для NSOutputStream obj. Затем вы можете использовать потоки, как показано здесь, и объяснены в справочном сообщении .

посмотрите на этот простой код;

let addr = "127.0.0.1"
let port = 4000

var host :NSHost = NSHost(address: addr)
var inp :NSInputStream?
var out :NSOutputStream?

NSStream.getStreamsToHost(host, port: port, inputStream: &inp, outputStream: &out)

let inputStream = inp!
let outputStream = out!
inputStream.open()
outputStream.open()

var readByte :UInt8 = 0
while inputStream.hasBytesAvailable {
    inputStream.read(&readByte, maxLength: 1)
}

// buffer is a UInt8 array containing bytes of the string "Jonathan Yaniv.".
outputStream.write(&buffer, maxLength: buffer.count)

Перед выполнением этого простого кода я запустил ncat для прослушивания на порту 4000 в моем терминале и набрал "Hello!" и оставил разъем открытым для связи.

Jonathans-MacBook-Air:~ johni$ ncat -l 4000
Hello !
Jonathan Yaniv.
Jonathans-MacBook-Air:~ johni$ 

После запуска кода вы увидите, что я получил строку "Jonathan Yaniv.\n" на терминал до закрытия сокета.

Надеюсь, это спасло некоторых из вас головную боль. Если у вас есть другие вопросы, дайте ему шанс, я надеюсь, что смогу ответить на него.

В этом сообщении объясняются и обозначаются. (Ссылка на использование чтения NSInputStream)