[英]IOS swift Web Socket SRWebSocket set response timeout
I am using SRWebSocket/SocketRocket library in my app I am unable to set response timeout for it.我在我的应用程序中使用 SRWebSocket/SocketRocket 库我无法为其设置响应超时。 I want to show a message if socket does not receive any data after few seconds
如果套接字在几秒钟后没有收到任何数据,我想显示一条消息
Following is my code以下是我的代码
socketRocket = SRWebSocket(url: URL(string: streamUrl)!)
socketRocket?.delegate = self
socketRocket?.open()
Using following callback methods as well也使用以下回调方法
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!) {
}
here is link to library这是图书馆的链接
https://github.com/facebook/SocketRocket https://github.com/facebook/SocketRocket
If you want to display some message when you don't get a response you can use a Timer
, the basics it looks like that:如果您想在没有得到响应时显示一些消息,您可以使用
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
}
and then you can call startTimer()
when it is needed ie when the socket is opened:然后您可以在需要时调用
startTimer()
,即打开套接字时:
func webSocketDidOpen(_ webSocket: SRWebSocket!) {
print("webSocketDidOpen")
showTableView()
startTimer()
}
or after you send a message:或在您发送消息后:
socketRocket?.send(message)
startTimer()
If you also want to set a timeout for connection (it is something separate from resopone timout), you can use URLRequest
instead of URL
:如果您还想设置连接超时(它与响应超时不同),您可以使用
URLRequest
而不是URL
:
let request = URLRequest(url: url, timeoutInterval: 30) //it is 30 sec connection timeout
socketRocket = SRWebSocket(urlRequest: request)
socketRocket?.delegate = self
socketRocket?.open()
Full class that supports both connection and response timeout:支持连接和响应超时的完整 class:
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, repeats: false, 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()
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.