如何在Swift中使用Socket(连接、发送和接收消息)

8

我是一名新手,希望制作 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")
         })
     })
 }

NSStream或第三方API。我最喜欢的是CocoaAsyncSocket,我也正在开发自己的Swift版本,可以看看Swidis(尽管还在测试中)。 - Brian Nezhad
尝试使用https://github.com/swiftsocket/SwiftSocket,它很容易使用。如果您尝试并且有什么不明白的地方,请在此处撰写评论。 - Alexey Pichukov
alex_p,感谢您的回答。SwiftSocket已连接但无法接收数据。请给我一个例子。 - Avazxon Ubaydullayev
@AvazxonUbaydullayev,我在下面创建了一个答案,并附上了使用此库的代码示例。 - Alexey Pichukov
2个回答

4

我使用 SwiftSocket https://github.com/swiftsocket/SwiftSocket 进行 TCP 连接。这个库很容易使用。例如,使用它(我添加了注释):

我有一个用于与此库一起工作的封装,以下是发送请求和获取响应的方法:

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

@AvazxonUbaydullayev,你能分享一下你的项目链接吗?因为没有代码很难说出问题所在。 - Alexey Pichukov
alex_p,请使用此链接获取我的项目:https://drive.google.com/open?id=0B3ShmF_Xwo0_eTNhYV83Y3dhOWs。这个项目是公开分享的。 - Avazxon Ubaydullayev
当您将SwiftSocket文件添加到项目中时,会自动创建'intercom-Brigding-Header.h'。我除了添加这些文件之外没有对项目做任何操作。从此链接https://github.com/swiftsocket/SwiftSocket/tree/master/SwiftSocket/ysocket中添加文件到您的项目中,它就可以工作了。 - Alexey Pichukov
好的,我明白你的意思,但第一次发送时它可以工作,但再次发送时却无法工作。 - Avazxon Ubaydullayev
1
只有当应用程序被终止(由Xcode停止或在iOS dock中被杀死)时,才会将写入输出流的消息发送到我的服务器。问题已解决,显然消息必须以“\n”结尾才能刷新输出流! - Avazxon Ubaydullayev
显示剩余7条评论

0

NSStream或第三方API。我最喜欢的是CocoaAsyncSocket,我也正在开发自己的Swift版本,请查看Swidis(仍处于Beta版)。

另外需要提到的是,使用CocoaAsyncSocket时,您需要包含一个bridge-header.h文件以供Swift使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接