Если вы пришли сюда из Naked Networking with SwiftUI, вы попали в нужное место, если нет, то вам нужно сначала прочитать это.

Голый нетворкинг со 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. Сеть в нашем примере.

Читайте дальше, в следующей статье я попытаюсь превратить наше очень простое приложение в простую игру.