实现基本连接步骤
- 导入相关框架:在Objective-C项目中,导入
CFNetwork
框架,它提供了网络编程的基础类和函数。
- 创建
CFStream
对象:使用CFStreamCreatePairWithSocketToHost
函数创建输入流和输出流,用于与物联网设备进行数据的读写。
- 设置流的代理:为输入流和输出流设置代理对象,以便在流状态发生变化时收到通知并进行相应处理。
- 打开流:调用
CFReadStreamOpen
和CFWriteStreamOpen
函数分别打开输入流和输出流。
关键代码片段
#import <Foundation/Foundation.h>
#import <CFNetwork/CFNetwork.h>
@interface TCPClient : NSObject <NSStreamDelegate> {
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
}
- (void)connectToHost:(NSString *)host port:(NSInteger)port;
- (void)sendData:(NSData *)data;
@end
@implementation TCPClient
- (void)connectToHost:(NSString *)host port:(NSInteger)port {
CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)host, port, &readStream, &writeStream);
if (readStream && writeStream) {
[(NSObject *)readStream setDelegate:self];
[(NSObject *)writeStream setDelegate:self];
CFReadStreamScheduleWithRunLoop(readStream, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
CFWriteStreamScheduleWithRunLoop(writeStream, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
CFReadStreamOpen(readStream);
CFWriteStreamOpen(writeStream);
}
}
- (void)sendData:(NSData *)data {
if (writeStream) {
CFWriteStreamWrite(writeStream, (const UInt8 *)[data bytes], [data length]);
}
}
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode {
switch (eventCode) {
case NSStreamEventOpenCompleted:
NSLog(@"Stream opened");
break;
case NSStreamEventHasBytesAvailable:
if (aStream == (NSStream *)readStream) {
uint8_t buffer[1024];
NSInteger len = CFReadStreamRead(readStream, buffer, 1024);
if (len > 0) {
NSData *data = [NSData dataWithBytes:buffer length:len];
NSLog(@"Received data: %@", data);
}
}
break;
case NSStreamEventErrorOccurred:
NSLog(@"Stream error: %@", [(NSError *)CFBridgingRelease(CFReadStreamCopyError(readStream)) localizedDescription]);
break;
case NSStreamEventEndEncountered:
NSLog(@"Stream ended");
[(NSObject *)readStream close];
[(NSObject *)writeStream close];
CFRelease(readStream);
CFRelease(writeStream);
break;
default:
break;
}
}
@end
常见错误及处理
- 连接失败:可能由于设备IP地址错误、端口号不正确、网络不可达等原因导致连接失败。处理方法是检查设备IP和端口号是否正确,确保设备处于联网状态且防火墙未阻止连接。在代码中,可以通过在
stream:handleEvent:
方法中捕获NSStreamEventErrorOccurred
事件,获取错误信息并进行相应提示。
- 流操作错误:例如读取或写入数据时发生错误。同样在
stream:handleEvent:
方法中捕获NSStreamEventErrorOccurred
事件,获取具体错误,可能是流已关闭、缓冲区已满等原因,根据错误类型进行相应处理,如重新打开流或调整缓冲区大小。
- 网络中断:在连接过程中网络可能中断。可以通过检测
NSStreamEventEndEncountered
事件来处理网络中断情况,此时关闭流并进行相应的重连逻辑。