我正在尝试向我的应用程序添加一个简单的功能,它应该简单地将预先格式化的字符串发送到另一个设备,就像 WiTap 示例代码所做的那样。这听起来像是一件非常微不足道的事情,但我无法让它工作;(。我如何修改 WiTap 以发送字符串而不是单个整数?
任何好的教程的指针都会很棒。
我确实查看了 SimpleNetworkStreams 示例,但它超出了我的想象,因为我只想发送一个字符串(NSString、char[],没有偏好)而不是文件。
也看了这个例子:How to add data for NSOutputStream?但这也没有完全帮助。
最佳答案
我已经想通了,并决定在这里回答我自己的问题,以造福那些处于类似情况的人。
每当我想发送任何字符串时,我都会使用我创建的这个辅助函数:
- (void) send:(NSString *)string {
const uint8_t *message = (const uint8_t *)[string UTF8String];
if (_outStream && [_outStream hasSpaceAvailable])
if([_outStream write:message maxLength:strlen((char *)message)] == -1)
NSLog(@"Failed sending data to peer");
}
在接收端,它看起来像这样:
- (void) stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode {
switch(eventCode) {
case NSStreamEventHasBytesAvailable:
{
if (stream == _inStream) {
// read it in
unsigned int len = 0;
len = [_inStream read:buf maxLength:buffSize];
buf[len] = '\0';
if(!len) {
if ([stream streamStatus] != NSStreamStatusAtEnd)
NSLog(@"Failed reading data from peer");
} else {
NSString *message = [NSString stringWithUTF8String:(char *)buf];
// here you do whatever you need with your received NSString *message
}
}
}
}
缓冲区定义为:
#define buffSize 60000
uint8_t buf[buffSize];
60,000 是相当任意的,您可以更改它以满足您的需要。
关于上述内容的一些说明。虽然将这些字符串的缓冲区设置得相当大是安全的,但永远不能保证您一次性收到字符串。在实际的应用程序中,您应该仔细设计一个特定的协议(protocol),您可以依靠它来检查您是否收到了整个字符串,并在必要时合并在后续 NSStreamEvent
期间收到的字符串。
关于iPhone SDK通过wifi发送字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3086967/