web-dev-qa-db-ja.com

Swift(接続、送信、メッセージの取得)でソケットを使用する方法)

私は新しいSwiftです。 iPhoneでチャットをしたいので、クライアントsokectを使用する必要があります。これを作る方法。私にアドバイスまたは例を挙げてください。私はこれを試しました 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)
     }

このコードを変更した後:

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

私はSwiftSocket接続にTCPhttps://github.com/swiftsocket/SwiftSocket を使用しています。使い方は簡単です。たとえば、使用する場合(コメントを追加します):

私はこのlibを使用するためのラッパーを持っています。これは、リクエストを送信してレスポンスを取得する方法です。

    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

NSStreamまたはサードパーティのAPI。私のお気に入りは CocoaAsyncSocket で、私もSwift自分でバージョンを作成しています。確認してください Swidis (まだベータ版)

また、CocoaAsyncSocketについて言及するには、Swiftとして使用するために bridge-header.h を含める必要があります。

0
Farhad