- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我使用 Objective-C 的 SocketRocket 库连接到 websocket:
-(void)open {
if( self.webSocket ) {
[self.webSocket close];
self.webSocket.delegate = nil;
}
self.webSocket = [[SRWebSocket alloc] initWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"ws://192.168.0.254:5864"] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:20]];
self.webSocket.delegate = self;
[self.webSocket open];
}
打开连接完全没问题。建立连接后调用委托(delegate)。
-(void)webSocketDidOpen:(SRWebSocket *)webSocket {
NSLog(@"WebSocket is open");
}
但是当我想关闭连接时,什么也没有发生。
-(void)close {
if( !self.webSocket )
return;
[self.webSocket close];
self.webSocket.delegate = nil;
}
没有调用成功关闭连接的委托(delegate)。谁能告诉我为什么会这样?
感谢您阅读我的问题。
最佳答案
我发现委托(delegate)从未被调用,因为 websocket 从未真正关闭过。 SRWebSocket 中的 websocket 关闭发生在 pumpWriting 方法中,如下所示:
if (_closeWhenFinishedWriting &&
_outputBuffer.length - _outputBufferOffset == 0 &&
(_inputStream.streamStatus != NSStreamStatusNotOpen &&
_inputStream.streamStatus != NSStreamStatusClosed) &&
!_sentClose) {
_sentClose = YES;
[_outputStream close];
[_inputStream close];
if (!_failed) {
dispatch_async(_callbackQueue, ^{
if ([self.delegate respondsToSelector:@selector(webSocket:didCloseWithCode:reason:wasClean:)]) {
[self.delegate webSocket:self didCloseWithCode:_closeCode reason:_closeReason wasClean:YES];
}
});
}
_selfRetain = nil;
NSLog(@" Is really closed and released ");
}
else {
NSLog(@" Is NOT closed and released ");
}
所有流和保留 websocket 的对象都在那里关闭或删除。只要它们仍然打开,套接字就不会适当关闭。但是在我的程序中从未发生过关闭,因为当我尝试关闭 websocket 时,_closeWhenFinishedWriting 始终为 NO。
此 bool 值仅在 disconnect 方法中设置一次。
- (void)_disconnect;
{
assert(dispatch_get_current_queue() == _workQueue);
SRFastLog(@"Trying to disconnect");
_closeWhenFinishedWriting = YES;
[self _pumpWriting];
}
但是在SRWebSocket中调用closeWithCode方法时,disconnect只会在一种情况下被调用,即如果websocket处于连接状态。
BOOL wasConnecting = self.readyState == SR_CONNECTING;
SRFastLog(@"Closing with code %d reason %@", code, reason);
dispatch_async(_workQueue, ^{
if (wasConnecting) {
[self _disconnect];
return;
}
这意味着,如果套接字处于另一种状态,则 websocket 永远不会真正关闭。一种解决方法是始终调用 disconnect 方法。至少它对我有用,一切似乎都很好。
如果有人知道为什么 SRWebSocket 是这样实现的,请对该答案发表评论并帮助我。
关于objective-c - WebSocket 连接未使用 SocketRocket 关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15530437/
我明白了。这是我第一次尝试安装它,我必须安装它,因为我需要 Pony Debugger 正常工作。 Undefined symbols for architecture i386: "_utf8_
我目前在我的 appdelegate.m 中有一个 socketrocket 连接 _webSocket = [[SRWebSocket alloc] initWithURLRequest:[NSUR
我正在开发一个 iPhone 应用程序(使用 iOS 9 beta)。我正在使用我正在使用的套接字连接 SocketRocket客户端库。但是当我尝试与一些无效的主机名建立 wss 连接时,我在打开套
我正在使用 SocketRocket ,但我无法让它在后台传递消息。当我再次打开该应用程序时,它会恢复连接(无需重新连接)并且所有消息都会立即进入。 这是我的连接代码: - (void)_reconn
我正在使用 SocketRocket 库:SocketRocket Github对于基于 websockets 的 mqtt。我已成功连接服务器。 let socket = SRWebSocket(u
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 4 年前。 Improve this qu
所以我们的应用程序在 SocketRocket 中已经经历了一段时间的崩溃。我们每天从中得到大约 20 次崩溃,堆栈跟踪如下: Crashed: com.apple.root.default-over
所以我想使用 socket.io 开发一个基本的聊天应用程序。我正在使用 this框架,本质上只是 SocketRocket 的包装器。 现在我创建了一个 connectToHost:onPort 并
我是 iOS 编程新手,仍在学习 Swift。我正在尝试使用 SocketRocket 库 https://github.com/facebook/SocketRocket在 Swift 项目中,以便
刚刚切换到与 Protobufs 结合的 Websockets。在 IOS 上就像一个魅力,但我不确定如何通过 SocketRocket Lib 实现 SSL 握手(如 NSURLConnection
我目前正在使用 SocketRocket 作为我的 iOS 应用程序的 WebSocket 实现,并希望将我服务器的 CA 固定为具有 SR_SSLPinnedCertificates 属性的受信任证
我今天才开始使用 CocoaPods...首先,我添加了 AFNetworking,效果很好……然后我需要 SocketRocket…… 然而,SRWebSocket.m 在添加 CocoaPods
尝试使用 SocketRocket 连接到自定义套接字服务器时出现错误: Error Domain=SRWebSocketErrorDomain Code=2133 "Invalid Sec-WebS
新的 iOS websocket 库,SocketRocket ,看起来真的很棒,聊天示例项目真的很可爱。示例聊天服务器是用 Python 编写的,我对此一无所知。我对 node.js 上的 sock
我使用 Objective-C 的 SocketRocket 库连接到 websocket: -(void)open { if( self.webSocket ) { [self.webSoc
我刚刚使用 SocketRocket 制作了一个简单的实时文本聊天应用程序。它在 iOS 6.0 和 5.1 上运行良好,但是当我尝试在连接时在 5.0 上运行它时,出现以下错误... Websock
我写了一个简单的Node.js WebSocket chat server 。为了运行服务器,我将 foreman start 与仅包含以下行的 Procfile 结合使用:chat: npm sta
NSString *urlString = @"ip address"; self.webSocket = [[SRWebSocket alloc] initWithURLRequest:[NSURL
我使用的是 Xcode 版本 6.0.1 (6A317),并且很长一段时间都遇到 Apple Mach-O 错误。引入 SocketRocket 项目后出现此错误。 duplicate symbol
我将 SocketRocket 移动到自定义框架中,现在未调用委托(delegate)方法。这段代码在不在框架中时确实有效,它在主线程上运行并且委托(delegate)不为空。 _mSocket
我是一名优秀的程序员,十分优秀!