web-dev-qa-db-fra.com

comment utiliser socket dans Swift (connecter, envoyer et recevoir un message)

Je suis nouveau Swift. Je veux faire un chat pour iphone donc je dois utiliser le client sokect. comment faire cela. donnez-moi des conseils ou des exemples plz . J'ai essayé ceci https://github.com/socketio/socket.io-client-Swift

 let client:TCPClient = TCPClient(addr: "89.236.254.27", port: 9000)
     let (success,errmsg) = client.connect(timeout: 1)
     if success {
          let (success,errmsg) = client.send(str:"Hello World!")
          if success {
               let data = client.read(1024 * 10)
               if let d = data {
                    if let str = NSString(bytes: d, length: d.count, encoding: NSUTF8StringEncoding) {
                         print(str)
                    }
               }
          } else {
               print(errmsg)
          }
     } else {
          print(errmsg)
     }

après avoir changé ce code:

 override func viewDidLoad() {
     super.viewDidLoad()

     let qualityOfServiceClass = QOS_CLASS_BACKGROUND
     let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)
     dispatch_async(backgroundQueue, {
         let client:TCPClient = TCPClient(addr: "89.236.254.27", port: 9000)
         var (success, errmsg)=client.connect(timeout: 1)
         if success {
             var (isSuccess, errorMessage) = client.send(str: "Hello!")
             if success {
                 let data = client.read(1024 * 4)
                 if let d = data {
                     if let str = NSString(bytes: d, length: d.count, encoding: NSUTF8StringEncoding) as? String {
                         print(str)
                     }
                 }
             } else {
                 print(errmsg)
             }
         } else {
             print(errmsg)
         }
         dispatch_async(dispatch_get_main_queue(), { 
            () -> Void in
            print("This is run on the main queue, after the previous code in outer block")
         })
     })
 }
7

J'utilise la connexion SwiftSockethttps://github.com/swiftsocket/SwiftSocket pour TCP. C'est facile a utiliser. Par exemple pour l'utiliser (j'y ajoute des commentaires):

J'ai mon wrapper pour travailler avec cette lib et c'est la méthode pour envoyer une requête et obtenir une réponse:

    private func blockingRequest(data: String, client: TCPClient?) -> (data: String?, error: ConnectionError?) {
        // It use ufter connection
        if client != nil {
            // Send data
            var (isSuccess, errorMessage) = client!.send(str: data)
            if isSuccess {
                // Read response data
                var data = client!.read(1024*10)
                if let d = data {
                    // Create String from response data
                    if let str = NSString(bytes: d, length: d.count, encoding: NSUTF8StringEncoding) as? String {
                        return (data: str, error: nil)
                    } else {
                        return (data: nil, error: ConnectionError.BadResponseData)
                    }
                } else {
                    return (data: nil, error: ConnectionError.BadResponseData)
                }
            } else {
                println(errorMessage)
                return (data: nil, error: ConnectionError.RequestError)
            }
        } else {
            return (data: nil, error: ConnectionError.RequestError)
        }
    }
4
Alexey Pichukov

API NSStream ou tierces. Mon préféré est CocoaAsyncSocket , je travaille aussi sur une version de Swift moi-même, vérifiez-le Swidis (Still Beta)

De plus, avec CocoaAsyncSocket, vous devrez inclure un bridge-header.h à utiliser en tant que Swift.

0
Farhad