Если вы пришли сюда из Naked Networking with SwiftUI, вы попали в нужное место, если нет, то вам нужно сначала прочитать это.
Предполагая, что вы уже прочитали родственную статью и создали проект nudeNetwoking, давайте двигаться вперед.
Мы будем реализовывать говорящую часть нашего супер простого приложения. Это я боюсь немного цыпленка и яйца, но голый со мной. Думаю, я пойду так же, как и предыдущий код. Я начну с сети и закончу SwiftUI.
Сеть
Давайте вернемся к нашему классу подключения и определим говорящего с помощью этого кода.
func connectToUDP(hostUDP:NWEndpoint.Host,portUDP:NWEndpoint.Port) { self.talking = NWConnection(host: hostUDP, port: portUDP, using: .udp) self.talking?.stateUpdateHandler = { (newState) in switch (newState) { case .ready: break default: break } } self.talking?.start(queue: .main) }
Мы начнем с определения начального соединения, как и в другой статье, здесь есть больше случаев, которые нужно добавить, но я сосредоточусь на голом кодировании.
Установив соединение, мы можем использовать этот метод для отправки некоторых данных.
func sendUDP(_ content: String) { let contentToSendUDP = content.data(using: String.Encoding.utf8) self.talking?.send(content: contentToSendUDP, completion: NWConnection.SendCompletion.contentProcessed(({ (NWError) in if (NWError == nil) { // code } else { print("ERROR! Error when data (Type: String) sending. NWError: \n \(NWError!) ") } }))) }
Я снова добавил немного менее очевидного кода обработки ошибок.
Но подождите, здесь в дело вступают курица и яйцо. Нам нужно реализовать некоторый код SwiftUI, чтобы протестировать это, хотя я действительно хочу протестировать это без SwiftUI.
Чтобы не усложнять, давайте просто реализуем это с помощью некоторых неприятных магических чисел и немного кода в SwiftUI. Примечание. Мне нужно было переместить объект связи на уровень выше с точки зрения области действия. Переместите этот код, который у вас уже есть, над телом var.
let communication = Connect()
А затем пометьте этот код в .onAppear текстовой кнопки.
DispatchQueue.main.asyncAfter(deadline: .now() + 4, execute: { let host = NWEndpoint.Host.init("192.168.1.123") let port = NWEndpoint.Port.init("1984") self.communication.connectToUDP(hostUDP: host, portUDP: port!) self.communication.sendUDP("push\n") })
Теперь вы готовы проверить это. Иди и беги.
Вы должны начать с пустого экрана, а затем увидеть, как появляется слово «Push», когда connectToUDP запускается через 4 секунды. Конечно, вам нужно убедиться, что магические числа верны. Номер порта должен совпадать, IP-адрес точно не будет.
SwiftUI
Теперь вернемся на неизведанную территорию. Что нам нужно. Как минимум нам нужна кнопка для запуска отправки сообщения. Давайте сделаем это. Я включу сюда весь код ContentView, потому что SwiftUI новый.
struct ContentView: View { @ObservedObject var globalVariable:BlobModel = BlobModel.sharedInstance let communication = Connect() var body: some View { VStack { Text("\(globalVariable.score)") .onAppear { let port2U = NWEndpoint.Port.init(integerLiteral: 1984) self.communication.listenUDP(port: port2U) } Button(action: { let host = NWEndpoint.Host.init("192.168.1.123") let port = NWEndpoint.Port.init("1984") self.communication.connectToUDP(hostUDP: host, portUDP: port!) self.communication.sendUDP("fire\n") }) { Text("smoke") } } } }
Что нового по сравнению с предыдущей версией. мы передали инициализацию связи в область намотки, ввели вертикальный поток стека и переместили наше синхронизированное UDP-сообщение на кнопку. [Вы должны удалить тот, который начинается через 4 секунды].
Скопируйте код в свой проект и попробуйте. Сначала вы должны увидеть только кнопку дыма. Нажмите ее и получите «огонь».
Теперь до вас, должно быть, дошло, что мы на самом деле разговариваем здесь сами с собой, что, подобно приложению, которое просто печатает «Hello World», имеет… ограниченную ценность.
Одно из самых простых и быстрых изменений, которые мы можем сделать, чтобы исправить это, — изменить IP-адрес отправителя на широковещательный. Что, говоря языком IP4, означает, что нам нужно завершить его с помощью 255. Давайте пойдем дальше и извлечем весь процесс в его мини-метод on. в файле ContentView.swift.
func makeConnect(port: String, message: String) { let host = NWEndpoint.Host.init("192.168.1.255") let port = NWEndpoint.Port.init(port) communication.connectToUDP(hostUDP: host, portUDP: port!) communication.sendUDP(message) }
Измените действие кнопки, чтобы теперь оно вызывало новый метод, задавая ему параметры, которые имеют смысл.
makeConnect(port: "4891", message: "ping")
Теперь, когда он отправляет сообщение, он также будет отправлять его всем устройствам в сети 192.168.1.X. Сеть в нашем примере.
Читайте дальше, в следующей статье я попытаюсь превратить наше очень простое приложение в простую игру.