iPhone SDK通过WiFi发送字符串

6
我正在尝试向我的应用程序添加一个简单的功能,它应该像WiTap示例代码一样,仅发送预格式化的字符串到另一个设备。听起来这是一件非常微不足道的事情,但我无法使其工作 ;(。我该如何修改WiTap以发送字符串而不是单个int?
如果有好的教程指导,任何指针都将非常棒。
我查看了SimpleNetworkStreams示例,但由于我只想发送一个字符串(NSString,char [],没有偏好),所以它超出了我的能力范围。
我也看了这个例子:如何为NSOutputStream添加数据?,但那也没有完全帮助我。

我只需要传递类似于(const uint8_t *)[strBuffer UTF8String];的东西吗?其中,strBuffer是用于写入缓冲区的NSString。 - SaltyNuts
1个回答

4

我已经明白了,并决定在这里回答自己的问题,以使处于类似情况下的人受益。

每当我想发送任何字符串时,我都会使用我创建的这个辅助函数:

- (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];

6万这个数字并不是固定的,你可以根据需要进行更改。

上面有几点需要注意。虽然为这些字符串设置较大的缓冲区是安全的,但不能保证一次性接收到完整的字符串。在实际应用中,您应该仔细设计一种协议,以便检查是否接收到了完整的字符串,并在必要时结合后续 NSStreamEvent 接收到的字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接