带Swift的套接字

我正在用套接字创建我的Swift程序,我想知道是否需要使用GCDAsyncSocket库? 我正在尝试创建一个将字符串发送到我的mac os x app的iOS应用程序。 我之前在Java中编写了一个类似于此的套接字应用程序,所以我对套接字非常熟悉。 我的服务器端(mac os)代码看起来像这样,我不确定如何接近客户端(iOS端)

var bsocket: GCDAsyncSocket! func applicationDidFinishLaunching(aNotification: NSNotification) { bsocket = GCDAsyncSocket(delegate: self, delegateQueue: dispatch_get_main_queue()) var port:UInt16 = 8090 if (!bsocket.connectToHost("localhost", onPort: port, error: nil)) { println("Error") } else { println("Connecting...") } } func socket(socket : GCDAsyncSocket, didReadData data:NSData, withTag tag:UInt16) { var response = NSString(data: data, encoding: NSUTF8StringEncoding) println("Received Response") } func socket(socket : GCDAsyncSocket, didConnectToHost host:String, port p:UInt16) { println("Connected to \(host) on port \(p).") var request:String = "Welcome to the server." var data:NSData = request.dataUsingEncoding(NSUTF8StringEncoding)! bsocket.writeData(data, withTimeout: -1.0, tag: 0) bsocket.readDataWithTimeout(-1.0, tag: 0) } 

来自Ray Wenderlich.com的教程http://www.raywenderlich.com/3932/networking-tutorial-for-ios-how-to-create-a-socket-based-iphone-app-and-server有一个很好的描述客户端需要连接到基本服务器套接字。 它不执行websocket协议中所需的任何握手,心跳和帧,因此它与websockets不兼容。 您的代码没有显示websocket协议所需的任何握手,因此我认为这就是您想要的。 如果您需要websockets,请查看https://github.com/daltoniam/Starscream

以下是我的Swift解释的基础知识。 我最终得到了一个经理和一个连接:

 class Manager : NSObject { var conn = Connection() func connect() { let (host, port) = screen.getAddress() conn.connect(host, port: port) } func disconnect() { conn.disconnect() } func sendMessage(params:[String : AnyObject]) { let msg = "send_message:" + JSONStringify(params) let data : NSData = msg.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)! var buffer = [UInt8](count:data.length, repeatedValue:0) data.getBytes(&buffer) conn.outputStream.write(UnsafePointer(data.bytes), maxLength: data.length) } func JSONStringify(value: AnyObject) -> String { if NSJSONSerialization.isValidJSONObject(value) { if let data = NSJSONSerialization.dataWithJSONObject(value, options: nil, error: nil) { if let string = NSString(data: data, encoding: NSUTF8StringEncoding) { return string } } } return "" } } class Connection : NSObject, NSStreamDelegate { var serverAddress: CFString = "127.0.0.1" var serverPort: UInt32 = 8443 private var inputStream: NSInputStream! private var outputStream: NSOutputStream! func connect(address: CFString, port:UInt32) { println("connecting...") var readStream: Unmanaged? var writeStream: Unmanaged? CFStreamCreatePairWithSocketToHost(nil, address, port, &readStream, &writeStream) // Documentation suggests readStream and writeStream can be assumed to // be non-nil. It might be wise to test if either is nil // and implement error-handling as needed. self.inputStream = readStream!.takeRetainedValue() self.outputStream = writeStream!.takeRetainedValue() self.inputStream.delegate = self self.outputStream.delegate = self self.inputStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode) self.outputStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode) self.inputStream.open() self.outputStream.open() } func disconnect() { self.inputStream.close() self.outputStream.close() } func stream(aStream: NSStream, handleEvent eventCode: NSStreamEvent) { switch (eventCode){ case NSStreamEvent.ErrorOccurred: NSLog("ErrorOccurred") case NSStreamEvent.EndEncountered: NSLog("EndEncountered") case NSStreamEvent.None: NSLog("None") case NSStreamEvent.HasBytesAvailable: NSLog("HasBytesAvaible") var buffer = [UInt8](count: 4096, repeatedValue: 0) while (inputStream.hasBytesAvailable){ var len = inputStream.read(&buffer, maxLength: buffer.count) if(len > 0){ var output = NSString(bytes: &buffer, length: buffer.count, encoding: NSUTF8StringEncoding) if (output != ""){ NSLog("server said: %@", output!) } } else { println("empty string from stream") } } case NSStreamEvent.allZeros: NSLog("allZeros") case NSStreamEvent.OpenCompleted: NSLog("OpenCompleted") case NSStreamEvent.HasSpaceAvailable: NSLog("HasSpaceAvailable") default: println("default reached. unknown stream event") } } } 

您可能还会发现这些链接对Swift中的消息传递很有用:

我不确定此代码中的JSON转换是否正常工作。 我发现我需要websockets,因此不再使用它。

假设你说“套接字”你的意思是“网络套接字”,我会考虑使用Socket Rocket,由Square。 它确实做得很好,并且抽象出了使用Web套接字的困难部分。

https://github.com/square/SocketRocket

如果iOS设备只是客户端而不是服务器,则可以使用NSStream。