2015-08-11 12 views
9

Ciao a tutti come menzione del titolo Sto cercando di inviare e ricevere dati dal mio server Redis in una lingua swift. Ho fatto molte ricerche e non riesco a trovare una buona risposta su questo argomento, il più vicino a cui sono arrivato è NSStream o alcuni progetti Github (la maggior parte con codice spezzato), ho cercato di creare una soluzione per 3 giorni ora, per favore qualcuno aiuto.Connessione al server Redis con NSStream in Swift

Requisiti di collegamento per Redis su Port :

  • TCP
  • Telnet (il mio preferito)

Problemi:

  1. App Delegato Crash filettatura 1: EXC_BAD_ACCESS(code=1, address=XXXXXXXX)VOLTE
  2. Nessun ritorno di dati

Classe con inizializzazione (Redis): Il più vicino ho potuto ottenere ad un livello in cui ho capito la procedura con NSStream, ma di nuovo questo non stampa nulla per tornare nel mio dialogo e non riesco a capire cosa c'è che non va.

class Redis: NSObject, NSStreamDelegate { 

    //Intilizing Stream & Requirement 
    var endPoint: CFString? 
    var onPort: UInt32? 
    var inputStream: NSInputStream? 
    var outputStream: NSOutputStream? 

Funzione Connessione server:

func serverConnection(endPoint: CFString, onPort: UInt32){ 

     //Streams Init 
     let Host: CFString = endPoint 
     let Port: UInt32 = onPort 
     var readStream: Unmanaged<CFReadStream>? 
     var writeStream: Unmanaged<CFWriteStream>? 

     //Bind Streams to Host and Port 
     CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, Host, Port, &readStream, &writeStream) 

     //Cast CFStream to NSStreams 
     inputStream = readStream!.takeRetainedValue() 
     outputStream = writeStream!.takeRetainedValue() 

     //Assign Delegate 
     inputStream!.delegate = self 
     outputStream!.delegate = self 

     //Schadule Run-loop 
     inputStream!.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode) 
     outputStream!.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode) 

     //Open Connection 
     inputStream!.open() 
     outputStream!.open() 


    } 

Stream: Una volta che il pranzo app ottengo un errore delegato App VOLTE

filettatura 1: EXC_BAD_ACCESS (codice = 1, indirizzo = XXXXXXXX)

func stream(aStream: NSStream, handleEvent eventCode: NSStreamEvent) { 
     if aStream === inputStream { 
      switch eventCode { 
      case NSStreamEvent.ErrorOccurred: 
       //Print Available Errors 
       print("Error: \(aStream.streamError?.description)") 
       break 
      case NSStreamEvent.OpenCompleted: 
       //Connection Succeed 
       print("Connection Complete \(aStream.description)") 
       break 
      case NSStreamEvent.HasBytesAvailable: 
       //Server Respond 
       var buffer = [UInt8](count: 8, repeatedValue: 0) 
       while inputStream?.hasBytesAvailable != nil { 
        let result: Int = (inputStream?.read(&buffer, maxLength: buffer.count))! 
        print(result) 
        print(buffer) 
       } 
       break 
      default: 
       break 

      } 
     } 

     if aStream === outputStream { 
      switch eventCode { 
      case NSStreamEvent.ErrorOccurred: 
       //Print Available Errors 
       print("Error: \(aStream.streamError?.description)") 
       break 
      case NSStreamEvent.OpenCompleted: 
       //Connection Succeed 
       print("Connection Complete \(aStream.description)") 
       break 
      case NSStreamEvent.HasSpaceAvailable: 
       //Ready to Send more Dat 
       print("HasSpaceAvailable \(aStream.description)") 
       break 
      default: 
       break 

      } 
     } 

    } 

Test Server con Ping: il ritorno dovrebbe essere PONG

func Ping(){ 
    let Command: NSString = NSString(format: "Ping /n", String(endPoint)) 
    let data: NSData = NSData(data: Command.dataUsingEncoding(NSUTF8StringEncoding)!) 
    outputStream!.write(UnsafePointer<UInt8>(data.bytes), maxLength: data.length) 
} 

risposta

3

Grazie a GCDAsyncSocket, sono stato in grado di creare una soluzione per il collegamento Redis con Swift 2. Sto anche lavorando su Full Set Framework su Github per Redis se qualcuno fosse interessato al download.

Redis Classe: è necessario includere GCDAsyncSocketDelegate.

import Foundation 
class Redis: NSObject, GCDAsyncSocketDelegate { 

    //Alloc GCDAsyncSocket 
    var Socket: GCDAsyncSocket? 

    /*============================================================ 
    // Server Open Connection 
    ============================================================*/ 
    func server(endPoint: String, onPort: UInt16){ 

     //Check For Socket Condition 
     if !(Socket != nil) { 

      //Assign Delegeate to Self Queue 
      Socket = GCDAsyncSocket(delegate: self, delegateQueue: dispatch_get_main_queue()) 

     } 

     var err: NSError? 

     /*============================================================ 
     GCDAsyncSocket ConnectToHost Throw Error so you must handle 
     this with Try [Try!], do, Catch. 
     ============================================================*/ 

     do{ 
      //Assign Function Constants 
      try Socket!.connectToHost(endPoint, onPort: onPort) 
     }catch { 
      //Error 
      print(err) 
     } 

     //Read Send Data 
     Socket?.readDataWithTimeout(2, tag: 1) 
    } 


    //Server Confirmation 
    func socket(sock: GCDAsyncSocket!, didConnectToHost host: String!, port: UInt16) { 
     print("Connected to Redis!") 
    } 

    /*============================================================ 
    // Read Data From Redis Server [NSUTF8StringEncoding] 
    ============================================================*/ 

    func socket(sock: GCDAsyncSocket!, didReadData data: NSData!, withTag tag: Int) { 
     let Recieved: NSString = NSString(data: data, encoding: NSUTF8StringEncoding)! 
     print(Recieved) 
    } 

    /*=============================================================== 
    // Send Command [I Will create Full SET and Upload it to Github] 
    =================================================================*/ 

    func Command(Command: String){ 
     let request: String = Command + "\r\n" 
     let data: NSData = request.dataUsingEncoding(NSUTF8StringEncoding)! 
     Socket!.writeData(data, withTimeout: 1.0, tag: 0) 

    } 

} 

chiamare i metodi creando una costante della classe di Redis.

let redisServer = Redis() 
redisServer.server("XX.XX.XXX.XXX", onPort: 6379) 
redisServer.Command("Ping") //Return Should be **PONG** 
Problemi correlati