- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将 2 个设备与 NSNetService 连接 - 设备 A 发布服务,设备 B 可以浏览该服务并建立连接。昨天我注意到一个非常讨厌的问题。
我第一次在设备 A 上启动服务并尝试打开输入/输出流,一切都按预期进行。如果我随后退出设备 A 上的应用程序并重新打开它,则会创建该服务(因为 netServiceDidPublish 被调用),但是当我尝试再次打开流时,我收到以下错误域 = NSPOSIXErrorDomain Code=61“操作无法完成。连接被拒绝。然后我可以稍等一下,然后尝试再次打开应用程序,流将按预期再次打开。
我认为这与我退出应用程序时没有关闭流有关。这就是为什么我尝试关闭 -(void)applicationWillTerminate
中的流。负责关闭的方法被调用,但下次启动应用程序时,我收到相同的错误消息。
我用Apple提供的CocoaEcho示例代码进行了涂鸦,但没有发现任何重大差异。或者我可能是错的。
值得一提的是,我为服务发布创建了一个单例类。我认为这不重要,但人们永远无法知道。您可以在下面找到我用于服务发布、流打开和流关闭的一些代码。
开放服务:
-(void)startServiceWithName:(NSString*)name withType:(NSString*)type {
// init the socket
if(_socket) {
// socket initialized
addr = (struct sockaddr*)[[_socket address] bytes];
if (addr->sa_family==AF_INET) {
// IPV4
port = ntohs( ((struct sockaddr_in *)addr)->sin_port );
}
if (addr->sa_family==AF_INET6) {
// IPV6
port = ntohs( ((struct sockaddr_in6 *)addr)->sin6_port );
}
} else {
// socket nil
_socket = nil;
NSLog(@"Socket init failed. Can't handle");
}
// init the service
if(_socket) {
// we have a socket
_service = [[NSNetService alloc] initWithDomain:@"local."
type:type
name:name
port:port];
if (_service) {
[_service setDelegate:self];
[_service publish];
}
}
}
服务已发布:
-(void)netServiceDidPublish:(NSNetService *)sender {
NSLog(@"Service published on port %li", [sender port]);
if(![self openStreams]) {
NSLog(@"Could not open streams");
}
}
打开流
-(BOOL)openStreams {
NSInputStream *is;
NSOutputStream *os;
if ([_service getInputStream:&is outputStream:&os]) {
_inputStream = is;
_outputStream = os;
[_inputStream setDelegate:self];
[_outputStream setDelegate:self];
[_inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[_outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[_inputStream open];
[_outputStream open];
return YES;
}
return NO;
}
关闭流
-(void)closeStreams {
[_inputStream setDelegate:nil];
[_outputStream setDelegate:nil];
[_inputStream close];
[_outputStream close];
[_inputStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[_outputStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
_inputStream = nil;
_outputStream = nil;
}
希望这已经足够了。提前致谢
最佳答案
每次启动应用程序时,是否都会调用 -(void)startServiceWithName:(NSString*)name withType:(NSString*)type
?
我建议每次调用 -(void)startServiceWithName:(NSString*)name withType:(NSString*)type
之前关闭流。
例如:
[self.inStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
[inStream release];
inStream = nil;
[self.outStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
[outStream release];
outStream = nil;
[self startServiceWithName:someName withType:someType];
关于objective-c - NSStream - 操作无法完成。连接被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12854283/
我想使用 nsstreams 发送和接收一些数据。我不想让我的代码如此困惑,所以我想知道: 我是否需要保留对 NSStream 的强引用,或者 [NSStream scheduleInRunLoop:
我正在将文件上传到服务器,使用 NSStream API 分块读取。我正在尝试显示一个显示上传进度的进度条。我无法找到可靠的解决方案来确定读入文件的字节数。更改文件和 block 大小,我仍然不断获取
我真的不能理解这个事件。 我希望在发送队列(或类似内部结构)发送完先前写入的数据包后调用它。 这是正确的假设吗? 我正在通过Multipeer连接开发视频流,我想使用此属性来决定是否应该放下摄像机框架
我有一个应用程序在另一个线程上使用 NSStream 连接到服务器。如果用户决定注销,应用程序也会关闭连接。问题是我永远无法在用户断开连接后成功关闭流或线程。下面是关于如何为网络创建线程并尝试关闭流的
在我正在开发的 iPad 应用程序中,我需要将网络处理放在一个单独的线程上,因为它偶尔会阻塞应用程序的 UI。目前,我已经创建了一个 Connection 对象,所有网络逻辑都在其中进行( NSStr
我正在尝试在 iOS 上编写 telnet 客户端,但无法正确设置流。我认为它们可以工作,但每次触发委托(delegate)方法时我都会得到空缓冲区。 以下是我设置流的方式: self.manager
我在 iOS 中进行客户端-服务器通信已经有一段时间了,但我遇到了一个我无法理解的问题。 我写了两个基本函数:一个向服务器发送数据,另一个从服务器接收数据。每个都有一个名为 timeout 的参数,它
我有一个连续打开的 TCP 连接,用于与外部设备通信。通信管道中发生了很多事情,导致 UI 有时变得无响应。 我想将通信放在一个单独的线程中。我了解 detachNewThread 以及它如何调用 @
在Ray Wenderlich tutorial on sockets为了从 Objective-C 中的输入流中读取字节,我们做了 uint8_t buffer[1024]; int
我在连接到服务器的 iphone 应用程序中有一个 NSInputStream 和一个 NSOutputStream。我能够毫无问题地将数据读取和写入套接字。问题是我有一个断开连接按钮,当我尝试在其中
如何同步调用NSStream获取结果?? 目前我在其委托(delegate)方法之一中收到异步回调 `(void)stream:(NSStream *)theStream handleEvent:(
全部, 我已经通过注释、断点等方式将它运行到这一点。程序在标记的代码处崩溃。 -(void) initNetworkCommunication { CFReadStreamRef readSt
我编写了一个程序,使用 Apple 流编程指南中概述的 NSStream 协议(protocol)连接到给定 IP 上的服务器。数据的连接和传输工作完美,但是如果用户指定了错误的 IP 并且程序尝试打
我有一个使用 NSStream 进行连接的客户端-服务器应用程序。有时,当尝试打开连接时,连接的一侧在第一次尝试发送消息时会收到 NSStreamEventEndEncountered。 我使用 CF
我正在尝试为 NSStream 编写包装器之类的东西,以使我的生活更轻松。我只想知道什么时候建立连接,什么时候关闭,写一些数据获取接收到的数据。所以我在想这样的事情: 标题: @interface S
我需要从家庭自动化服务器获取设备列表的状态。我要查询的设备在一个数组中。 我正在尝试循环遍历该数组,对于每个设备,我正在向服务器发送数据。我遇到的问题是服务器只收到一个包含我的 3 个命令的字符串。
一切都按预期工作,只是一步一步抛出调试器,否则我会得到 EXC_BAD_ACCESS。我想我需要在某个地方延迟或等待(最好)某件事。 // 1) Create streams(input/output
我正在使用 Objective-C 创建一个基于套接字的 iOS 应用程序,现在我的要求是同时连接到两个服务器。 我正在使用 NSInputStream 和 NSOutputStream,我能够连接到
使用ExternalAccessory与蓝牙设备通信,我使用EASession提供的输入和输出NSStreams向其发送消息。 在Apple的EADemo示例中,它将两个流调度到主线程的运行循环。但是
我正在使用 NSStream 通过 MCSession 发送大量的 UIImage 数据。 当我得到字节时 - (void)stream:(NSStream *)aStream handleEvent
我是一名优秀的程序员,十分优秀!