Использование Swift для отправки данных на сервер Python по UDP - PullRequest
2 голосов
/ 06 февраля 2020

iOS 13, Swift 5, Xcode 11

Запуск сервера python udp.

#!/usr/bin/python

import socket

port = 31766

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('', port))
s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 1500)
print("listening on port ",port)

while True:
    compressed_data, server = s.recvfrom(1500)
    print(compressed_data)

Может подключаться с клиентом UDP.

#!/usr/bin/python
import socket

UDP_IP = "192.168.1.1"
UDP_PORT = 31766 
MESSAGE = "Hello, World!"

print "UDP target IP:", UDP_IP
print "UDP target port:", UDP_PORT
print "message:", MESSAGE

sock = socket.socket(socket.AF_INET, # Internet
         socket.SOCK_DGRAM) # UDP
sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))

Но когда я пытаюсь запустить службу BONJOUR

dns-sd -R wow _wow._udp local 31766

, я вижу это с моим iOS. Я могу видеть это с OSX. Я могу подключиться без ошибок и отправить данные с этим кодом ....

func connectToUDP(name: String) {
  self.talking = NWConnection(to: .service(name: name, type: "_wow._udp", domain: "local", interface: nil), using: .udp)

  self.talking?.stateUpdateHandler = { (newState) in
  switch (newState) {
  case .ready:
    print("ready to send")
    self.sendUDP("Boo")
  default:
    print("damn")
  }
}
self.talking?.start(queue: .main)
}

Мой сервер работает нормально, потому что я вижу данные, поступающие через него при запуске сценария отправки python. Но когда я пытаюсь отправить данные через быстрый код, я ничего не вижу.

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

self.talking = NWConnection(host: "192.168.1.110", port: 31766, using: .udp)

Но дело в том, что я эффективно теряю службу Bonjour. Примечание. Я использую эту команду, чтобы убедиться, что служба Bonjour запущена.

dns-sd -B _wow._udp

возвращает Просмотр _wow._udp ДАТА: --- Пт 07 фев 2020 --- 12: 08: 41.387. ..STARTING ... Отметка времени A / R флагов, если имя экземпляра службы домена 12: 08: 41.388 Добавить 3 1 локальный. _wow._udp. вау 12: 08: 41.388 добавить 3 4 местных. _wow._udp. вау 12: 08: 41.388 добавить 2 5 местных. _wow._udp. wow

И я использую эту команду для проверки правильности возврата параметров

dig -p 5353 @224.0.0.251 wow._wow._udp.local. SRV +short

возвращает 0 0 31766 Home-3.local.

Больше отладки. Я загрузил, скомпилировал и использовал это как сервер на моей OS X. Он работает.

OSX Network Framework

Очевидно, вам нужно изменить tcp в этом источнике на UDP и закомментируйте обратное соединение.

Также попытался получить хост + порт через

Bonjour: поиск службы по имени

И чем пошел со вторым вызовом для NWConnection, с возвращенной информацией ...

self.talking = NWConnection(host: "Home-3.local.", port: 31766, using: .udp)

Это тоже работает, Но на go вернемся к моему первоначальному вопросу. Я хочу попробовать подключиться к PYTHON серверу , а не к iOS или OSX. Кстати, вот код для браузера под iOS, который находит сервис!

func findUDP() {
print("findUDP")
let parameters = NWParameters()
parameters.includePeerToPeer = true

browser = NWBrowser(for: .bonjour(type: "_wow._udp", domain: "local."), using: parameters)
browser?.browseResultsChangedHandler = { foo, changes in
  for change in changes {
    switch change {
    case .added(let browseResult):
      playing = browseResult.endpoint
      print(browseResult.endpoint)
    default:
      print("anything else seen")
    }
  }
}
self.browser?.start(queue: .main)
...