iOS Swift Web Socket SRWebSocket设置响应超时

我在我的应用程序中使用SRWebSocket / Socketrocket库,无法为其设置响应超时。如果套接字几秒钟后没有收到任何数据,我想显示一条消息

以下是我的代码

socketrocket = SRWebSocket(url: URL(string: streamUrl)!)
socketrocket?.delegate = self
socketrocket?.open()

也使用以下回调方法

func webSocketDidOpen(_ webSocket: SRWebSocket!) {
    print("webSocketDidOpen")
    showTableView()
}

func webSocket(_ webSocket: SRWebSocket!,didCloseWithCode code: Int,reason: String!,wasClean: Bool) {
    getconversationId()
}

func webSocket(_ webSocket: SRWebSocket!,didFailWithError error: Error!) {
    print("didFailWithError\(error)")
    showLErrorView()
}

func webSocket(_ webSocket: SRWebSocket!,didReceiveMessage message: Any!) {
}

这是图书馆的链接

https://github.com/facebook/SocketRocket

woodfishzgw1234 回答:iOS Swift Web Socket SRWebSocket设置响应超时

如果您想在未收到回复时显示一些消息,则可以使用Timer,其基本内容如下:

var timer: Timer?
var responseTimeout: TimeInterval = 15

func startTimer() {
    timer?.invalidate()
    timer = Timer.scheduledTimer(withTimeInterval: responseTimeout,repeats: false,block: {[weak self] timer in
        self?.onResponseTimeout()
    })
}

func onResponseTimeout() {
    print("Didn't get response")
}

func webSocket(_ webSocket: SRWebSocket!,didReceiveMessage message: Any!) {
    print(message)
    timer?.invalidate() //invalidate timer when you get a message
}

,然后您可以在需要时调用startTimer(),即在打开套接字时:

func webSocketDidOpen(_ webSocket: SRWebSocket!) {
    print("webSocketDidOpen")
    showTableView()
    startTimer()
}

或在您发送消息后:

socketRocket?.send(message)
startTimer()

如果您还想设置连接超时(这与重音音色超时不同),则可以使用URLRequest代替URL

let request = URLRequest(url: url,timeoutInterval: 30) //it is 30 sec connection timeout

socketRocket = SRWebSocket(urlRequest: request)
socketRocket?.delegate = self
socketRocket?.open()

同时支持连接和响应超时的完整类:

import Foundation
import SocketRocket

class WebSocket: NSObject,SRWebSocketDelegate {

    var socketRocket: SRWebSocket?
    var timer: Timer?

    var responseTimeout: TimeInterval = 15

    func open(url: URL,connectionTimeout: TimeInterval = 10) {
        let request = URLRequest(url: url,timeoutInterval: connectionTimeout)
        socketRocket = SRWebSocket(urlRequest: request)
        socketRocket?.delegate = self
        socketRocket?.open()
    }

    func send(message: String) {
        socketRocket?.send(message)
        startTimer()
    }

    func startTimer() {
        timer?.invalidate()
        timer = Timer.scheduledTimer(withTimeInterval: responseTimeout,block: {[weak self] timer in
            self?.onResponseTimeout()
        })
    }

    func onResponseTimeout() {
        print("Didn't get response")
    }

    func webSocketDidOpen(_ webSocket: SRWebSocket!) {
        print("webSocketDidOpen")
        startTimer()
    }

    func webSocket(_ webSocket: SRWebSocket!,didCloseWithCode code: Int,reason: String!,wasClean: Bool) {
        print("closed with code: \(code),reason: \(reason),wasClean: \(wasClean)")
        timer?.invalidate()
    }

    func webSocket(_ webSocket: SRWebSocket!,didFailWithError error: Error!) {
        print("didFailWithError\(error)")
        timer?.invalidate()
    }

    func webSocket(_ webSocket: SRWebSocket!,didReceiveMessage message: Any!) {
        print(message)
        timer?.invalidate()
    }
}
本文链接:https://www.f2er.com/3154630.html

大家都在问