2015-02-11 37 views
0

我使用套接字創建Swift程序,我想知道是否需要使用GCDAsyncSocket庫?我正在嘗試創建一個將字符串發送到我的mac os x應用程序的iOS應用程序。我之前在Java中編寫過一個與此類似的套接字應用程序,所以我對套接字非常熟悉。我的服務器端(Mac OS)中的代碼看起來像這樣,我不知道該如何接近客戶端(iOS版側)使用Swift的套接字

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

回答

0

假設當你說「插座」你的意思是「網絡套接字」,我會考慮使用Socket Rocket,由Square提供。它確實做得很好,可以抽象出使用Web套接字的困難部分。

https://github.com/square/SocketRocket

+0

爲什麼我會使用網絡套接字?我沒有從瀏覽器中運行。 – user3630509 2015-02-12 04:58:35

0

你可以使用NSStream,如果iOS設備僅僅是一個客戶端,而不是服務器。

+0

iOS將只是一個客戶端,我只需要它發送一個「字符串」到服務器,併發回一個確認它收到它。這是否適用於NSStream?我現在會在google上搜索它。 – user3630509 2015-02-12 04:57:13

2

來自Ray Wenderlich.com的本教程http://www.raywenderlich.com/3932/networking-tutorial-for-ios-how-to-create-a-socket-based-iphone-app-and-server對連接到基本服務器套接字所需的客戶端有很好的描述。它不會執行websocket協議所需的任何握手,心跳和成幀,所以它不兼容websocket。你的代碼沒有顯示任何websocket協議所要求的握手,所以我認爲這就是你想要的。如果你需要websocket,看看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<UInt8>(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<CFReadStream>? 
    var writeStream: Unmanaged<CFWriteStream>? 

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

您也可能會發現這些鏈接在斯威夫特消息有用:

我不是確保此代碼中的JSON轉換工作正常。我發現我需要websocket,所以不再使用它。