使用Swift在UDP下向Python服务器发送数据

2024-04-26 18:38:32 发布

您现在位置:Python中文网/ 问答频道 /正文

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))

但是当我试着运行一个“你好”服务时

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发送脚本运行时,我看到数据通过。但当我尝试通过swift代码发送数据时,我什么也看不到

关于这一点还有一些注释。如果我更改NWConnection,使其看起来像这样,它就会工作

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

但关键是我失去了“你好”服务。注意:我使用此命令检查bonjour服务是否正在运行

dns-sd -B _wow._udp

returns Browsing for _wow._udp DATE: ---Fri 07 Feb 2020--- 12:08:41.387 ...STARTING... Timestamp A/R Flags if Domain Service Type Instance Name 12:08:41.388 Add 3 1 local. _wow._udp. wow 12:08:41.388 Add 3 4 local. _wow._udp. wow 12:08:41.388 Add 2 5 local. _wow._udp. wow

我用这个命令检查它是否返回正确的参数

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

returns 0 0 31766 Home-3.local.

更多的调试。我下载、编译并将其用作我的OS X上的服务器。它可以正常工作

OSX Network Framework

显然,您需要将此源中的tcp更改为UDP,并注释掉反向连接

还尝试通过此操作获取主机+端口

Bonjour: Search for a service by name

然后进行了第二次NWConnection调用,返回了信息

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

这也行,但是回到我最初的问题。我想尝试连接到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)

Tags: nameselfip服务器portlocalsocketios