【问题标题】:SocketRocket + Socketio Failing to Build HandshakeSocketRocket + Socketio 无法建立握手
【发布时间】:2015-03-27 15:04:04
【问题描述】:

我正在尝试根据本教程在 iOS 应用和 Socketio 服务器之间构建握手:Teehan+Lax

我遇到的问题是连接从未正确打开,我认为这是因为 Handshake + 令牌没有正确生成:

func initHandshake() {
    let time:NSTimeInterval = NSDate().timeIntervalSince1970 * 1000

    println(time)

    var timeString = "\(time)"

    var formattedTime = timeString.stringByReplacingOccurrencesOfString(".", withString: "-", options: NSStringCompareOptions.LiteralSearch)

    println(formattedTime)

    var endpoint = "http://\(server)/socket.io/1?t=\(formattedTime)"

    println(endpoint)

    var handshakeTask:NSURLSessionTask = session!.dataTaskWithURL(NSURL(fileURLWithPath: endpoint)!, completionHandler: { (data:NSData!, response:NSURLResponse!, error:NSError!) in
        if !(error != nil) {
            let stringData:NSString = NSString(data: data, encoding: NSUTF8StringEncoding)!
            let handshakeToken:NSString = stringData.componentsSeparatedByString(":")[0] as NSString
            println("HANDSHAKE \(handshakeToken)")

            self.socketConnect(handshakeToken)
        }
        if ((error) != nil) {
            println("Didn't connect. Why?")
        }
    })
    handshakeTask.resume()
}

您可以看到我在代码中尝试将端点 URL 与 Socketio 返回的字符串匹配,但没有骰子。它仍然没有连接。

我之前没有写过任何 Swift,所以我对这段代码实际上试图获取的内容感到相当迷茫:

var handshakeTask:NSURLSessionTask = session!.dataTaskWithURL(NSURL(fileURLWithPath: endpoint)!, completionHandler: { (data:NSData!, response:NSURLResponse!, error:NSError!) in

有人有什么想法吗?

【问题讨论】:

  • 我建议在您的 iOS 应用程序上使用一个库,它将抽象出 socket.io 握手的较低级别的细节。我用过github.com/MegaBits/SIOSocket
  • 我现在会调查一下,@influxd,谢谢

标签: sockets swift socket.io socketrocket


【解决方案1】:

我最终接受了下面@influxd 的建议并使用SIOSocket。真正帮助我的是很久以前埋在问题here 中的评论,一旦我将 SIOSocket 导入到我的项目中,就开始编写代码:

import UIKit

let host = "http://localhost:3000/"

let username = "swiftbot"

let message = "Hello World"

class ViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()

    self.connectToHost()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

private func connectToHost() {
    SIOSocket.socketWithHost(host, reconnectAutomatically: true, attemptLimit: 0, withDelay: 1, maximumDelay: 5, timeout: 20, response: {socket in
        socket.onConnect = {
            println("Connected to \(host)")
            socket.emit("add user", args: [username])
        }
        socket.on("login", callback: {(AnyObject data) -> Void in
            println(["login": data])
            socket.emit("new message", args: [message])
        })
        socket.onDisconnect = {
            println("Disconnected from \(host)")
        }
    })
}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    相关资源
    最近更新 更多