Swift Starscream websocket pod没有连接到本地服务器,也没有调用委托方法

时间:2016-06-14 06:18:23

标签: ios websocket swift2 starscream

我一直试图连接到本地服务器但没有成功。我的代码如下 -

class SocketManager: NSObject, WebSocketDelegate {
    var socket: WebSocket!

    override init() {
        super.init()

        self.socket = WebSocket(url: NSURL(string: "ws://localhost:9292/")!)
        self.socket.delegate = self
        print("TRYING TO CONNECT")
        self.socket.connect()
        print("DONE TRYING")
    }

    func websocketDidConnect(ws: WebSocket) {
        print("websocket is connected")
    }

    func websocketDidDisconnect(ws: WebSocket, error: NSError?) {
         print("websocket is disconnected: \(error?.localizedDescription)")
    }

    func websocketDidReceiveMessage(ws: WebSocket, text: String) {
        print("Received text: \(text)")
    }

    func websocketDidReceiveData(ws: WebSocket, data: NSData) {
         print("Received data: \(data.length)")
    }

    func websocketDidReceivePong(socket: WebSocket) {
        print("Got pong!")
    }
}

日志中存在“正在尝试连接”和“完成尝试”的打印语句,但似乎没有调用任何委托方法。

我不确定这里有什么不妥。

感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

问题在于,我在AppDelegate中创建了类SocketManager的实例,并且该变量超出了范围。

为了解决这个问题,我在AppDelegate中创建了一个实例变量,之后按照预期调用了委托方法。

这是我在Github回购中发布的问题的链接。

https://github.com/daltoniam/Starscream/issues/203

希望它有所帮助。

答案 1 :(得分:0)

对于仍然感到困惑的任何人,问题(对我而言)是我正在初始化并调用viewDidLoad中的所有内容:

let client = WsClient(echoURL: "ws://localhost:8000/")
client.connect()
client.socket.write(string: "Hi Server!")

要解决此问题,我仅将client定义移为ViewController的属性,同时将connectwrite保留在viewDidLoad中。这行得通!

现在我有

class ViewController: UIViewController {
    let client = WsClient(echoURL: "ws://localhost:8000/")
    (...)
    override func viewDidLoad() {
        client.connect()
        client.socket.write(string: "Hi Server!")
    }
}