2016-11-23 94 views
2

我最近开始学习Swift 3,我需要以某种方式将它与在Raspberry Pi上运行的Python程序进行交谈。我已经看到了几个像Socket.IO这样的库,可以实现这一点,但我不知道从哪里开始。我如何着手在Swift 3中创建一个套接字。我确实需要双向通信,所以我认为套接字是正确的方法是正确的。在Swift 3 iPhone应用程序中使用套接字

+0

你解决了你的问题吗? –

回答

2

取决于您使用的平台。由于你在iOS上,我建议利用InputStream/OutputStream。父流协议提供了一个接口的插座上创建输入/输出流,它利用CFSockets下方,有一个漂亮的雨燕3.0接口

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,并期待ar讨论了大量的Socket实现。所有主要的服务器端快速项目(Perfect,IBM Kitura,Vapor,Zewo,Noze等)都有一些可以使用的简单的套接字和/或SSL套接字实现,或者如果您想要,您可以编写自己的套接字无论如何,C插座就像他们一样。

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