2016-11-23 30 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有用描述符或類似的,而套接字只是一個文件描述符,所以...)