我在互联网上找到了一些建立tcp连接的课程。该链接位于here。我想自定义一个类,到目前为止,我能够建立连接发送数据和接收数据,这是伟大的。一旦我创建并导入了我提供的第一个链接使用的类,我就可以使用以下方法建立连接:
-(void) connectToServerUsingCFStream:(NSString *) urlStr portNo: (uint) portNo {
CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault,
(CFStringRef) urlStr,
portNo,
&readStream,
&writeStream);
if (readStream && writeStream) {
CFReadStreamSetProperty(readStream,
kCFStreamPropertyShouldCloseNativeSocket,
kCFBooleanTrue);
CFWriteStreamSetProperty(writeStream,
kCFStreamPropertyShouldCloseNativeSocket,
kCFBooleanTrue);
iStream = (NSInputStream *)readStream;
[iStream retain];
[iStream setDelegate:self];
[iStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
[iStream open];
oStream = (NSOutputStream *)writeStream;
[oStream retain];
[oStream setDelegate:self];
[oStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
[oStream open];
}
}
由于我将在我的应用程序中使用这个类,我正在创建自己的类,我想创建一个-(BOOL) connect{}
方法。我想要返回是连接已建立,否则没有。问题是,我能够判断我是否建立连接的方式是创建一个尝试发送数据的连接,然后在服务器端我创建了一个方法,每当我收到我发回一个字符串。如果在接下来的2秒内我收到数据,我知道连接已建立。
所以在我的连接方法中,我想等待2秒,然后根据BOOL变量didReciveData = YES返回一个值。
答案 0 :(得分:1)
由于您使用NSOutputStream
,更好的方法可能是检查[oStream write:]
的返回值:如果它返回-1,则没有数据已发送,因此没有连接。
但是,如果要等待两秒钟,可以使用NSTimer创建超时。如果在定时器触发之前收到响应,则可以使定时器无效,否则定时器将调用相关方法,该方法将通知两秒钟结束。
答案 1 :(得分:1)
您可以尝试暂停主循环。
- (void)test
{
NSLog(@"Test starting.");
BOOL wasSuccessful = [self connect];
NSLog(@"Success: %d", wasSuccessful);
}
- (BOOL)connect
{
// try to connect here, make sure to get a callback on success/failure
// fake callback
[self performSelector:@selector(callback:) withObject:[NSNumber numberWithBool:NO] afterDelay:2.0];
// wait for callback
CFRunLoopRun();
return self.success;
}
- (void)callback:(NSNumber *)successful
{
self.success = [successful boolValue];
CFRunLoopStop(CFRunLoopGetCurrent()); // now we want -connect to return!
}