ios - 在 Swift 3 iPhone 应用程序中使用套接字

标签 ios tcp swift3

我最近开始学习 Swift 3,我需要以某种方式让它与在 Raspberry Pi 上运行的 python 程序对话。我见过几个像 Socket.IO 这样的库可以实现这一点,但是我不确定从哪里开始。我如何在 Swift 3 中创建套接字。我确实需要 2 种方式的通信,所以我说套接字是正确的方式是否正确?

最佳答案

取决于您使用的平台。由于您使用的是 iOS,我建议您利用 InputStream/OutputStream。父 Stream 协议(protocol)提供了一个在套接字上创建输入/输出流的接口(interface),它在底层利用了 CFSockets 并且有一个很好的 Swift 3 接口(interface)

var inputStream: InputStream?
var outputStream: OutputStream?
Stream.getStreamsToHost(withName: "thing.local", port: 9090, inputStream: &inputStream, outputStream: &outputStream)

万一其他人对套接字感到疑惑,如果你/不/在 iOS、macOS 等上,Swift CoreFoundation 仍然不完整并且没有正确实现 Stream.getStreamsToHost(或许多其他东西不幸的是 :/) 但是你可以制作 posix 套接字,因为 Swift 可以使用 C

#if os(OSX) || os(iOS) || os(watchOS) || os(tvOS)
  import Darwin
#elseif os(Linux) || os(FreeBSD) || os(PS4) || os(Android)
  import Glibc
#endif

let sock = socket(AF_INET, Int32(SOCK_STREAM.rawValue), 0)
var addr = sockaddr_in(sin_family: sa_family_t(AF_INET),
                       sin_port: in_port_t(htons(UInt16(port))),
                       sin_addr: hostAddr,
                       sin_zero: (0, 0, 0, 0, 0, 0, 0, 0))
let addrPtr = withUnsafePointer(to: &addr){ UnsafePointer<sockaddr>(OpaquePointer($0)) }

let connected = connect(sock, addrPtr, UInt32(MemoryLayout<sockaddr_in>.size))

当然,这些内容读起来很不愉快,而且不是很 Swifty,但不要害怕去 github 上看看大量的 Socket 实现。所有主要的服务器端 swift 项目(Perfect、IBM Kitura、Vapor、Zewo、Noze 等)都有一些简单的套接字和/或 SSL 套接字实现供您使用,或者如果您愿意,可以自己编写并包装无论如何,C 套接字就像它们一样。

即使在 iOS 上,一个有趣的练习是扩展您的 GCD 知识并使用 DispatchSource 或 DispatchIO 编写基于 GCD 的套接字(DispatchSource 对于服务器监听很有用,IO 对于文件描述符的任何通用异步有序 IO 很有用等等,套接字只是一个文件描述符,所以...)

关于ios - 在 Swift 3 iPhone 应用程序中使用套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40772351/

相关文章:

android - cameras.isEmpty null flutter

iphone - 那里有适用于 iOS 的 unrar 库吗?

swift3 将 int 转换为 indexPath

ios - 我需要提交什么屏幕截图到应用商店

客户端关闭连接后Java TCPSocket中断

Python TCP 几个同时监听多个端口

vb6 winsock 控件 RemoteHostIP 截断 IP 地址的最后一位

swift - 检测到上下文泄漏,msgtracer 返回 -1 (Swift 3)

ios - 容器 View 中的按钮在第二个 View 中不起作用

objective-c - 处理 View 和递归