2016-06-08 3 views
5

J'ai une application dans laquelle je dois envoyer des données au serveur en utilisant la connexion socket et lire les données qui seront envoyées par le serveur. J'utilise la classe AsyncSocket pour écrire et lire des données. J'ai réussi à écrire des données sur le serveur et le serveur peut voir les données qui ont été envoyées par application. Maintenant, le problème est que chaque fois que le serveur envoie des données à l'application, comment puis-je recevoir ces données en utilisant la classe AsyncSocket. Voici mon code. J'ai mis la méthode des délégués pour lire les données mais elle n'a jamais appelé.Comment recevoir des données du serveur via socket dans iOS?

var socket = AsyncSocket() 

socket = AsyncSocket(delegate: self) 
self.socketConnect() 

func socketConnect() { 
     do { 
      try socket?.connectToHost("IP Address", onPort: 6968) 
     } catch _ as NSError { 

     } 
    } 



//MARK: - AsyncSocket Delegates method 

    func onSocket(sock: AsyncSocket!, didConnectToHost host: String!, port: UInt16) { 
     print("Connected to host : \(host) with Port : \(port)") 


     let alert:UIAlertController = UIAlertController(title: "Connected", message: "Host:\(host) ** Port:\(port)", preferredStyle:.Alert) 
     self.presentViewController(alert, animated: true, completion: nil) 
     let action:UIAlertAction = UIAlertAction(title: "Ok", style: .Default) { (UIAlertAction) -> Void in 
      print("Ok Pressed") 
     } 
     alert .addAction(action) 

     let dict = ["iUserId":"100","iRideId":"276","type":"client"] // For client side 
     var jsonString = NSString() 
     do { 
      let data = try NSJSONSerialization.dataWithJSONObject(dict , options: NSJSONWritingOptions.PrettyPrinted) 
      jsonString = NSString(data: data, encoding: NSUTF8StringEncoding)! 

     }catch let error as NSError { 
      print(error) 
     } 
     let reqData = jsonString.dataUsingEncoding(NSUTF8StringEncoding) 
     socket.writeData(reqData, withTimeout: 1.0, tag: 100) 

    } 

    func onSocket(sock: AsyncSocket!, didReadPartialDataOfLength partialLength: UInt, tag: Int) { 
     print("Read partial data") 
    } 

    func onSocket(sock: AsyncSocket!, didWriteDataWithTag tag: Int) { 
     print("Data write successfully") 
    } 

    func onSocket(sock: AsyncSocket!, didReadData data: NSData!, withTag tag: Int) { 
     print("Data read successfully") 
    } 

    func onSocket(sock: AsyncSocket!, willDisconnectWithError err: NSError!) { 
     print("Socket disconnect with error :\(err.description)") 
    } 

    func onSocket(sock: AsyncSocket!, didAcceptNewSocket newSocket: AsyncSocket!) { 
     print("Accept new socket") 
    } 
+0

Est-ce que cette classe (la déléguée) hérite de 'NSObject'? http://stackoverflow.com/a/24225381/653513 –

Répondre

1

J'ai trouvé la réponse pour moi-même. Ce que j'ai manqué est que je dois mettre la ligne readdata quand le socket est connecté à l'hôte. Donc, après l'écriture de cette méthode didReadData sera appelée et dans cette méthode doit également écrire un seul code de ligne que j'ai écrit dans la méthode didConnectToHost.

func socket(sock: GCDAsyncSocket!, didConnectToHost host: String!, port: UInt16) { 
     print("Connected to host : \(host) with Port : \(port)") 
     socket.readDataWithTimeout(-1, tag: 0) 
    } 

func socket(sock: GCDAsyncSocket!, didReadData data: NSData!, withTag tag: Int) { 
     print("Data read successfully") 


     socket.readDataWithTimeout(-1, tag: 0) 
}