【问题标题】:iPhone SDK send string over wifiiPhone SDK 通过 wifi 发送字符串
【发布时间】:2010-06-21 17:35:29
【问题描述】:

我正在尝试向我的应用程序添加一个简单的功能,它应该只是将预先格式化的字符串发送到另一台设备,就像 WiTap 示例代码所做的那样。这听起来像是一件非常微不足道的事情,但我无法让它工作;(。我如何修改 WiTap 以发送字符串而不是单个 int?

任何指向好的教程的指针都会很棒。

我确实看过 SimpleNetworkStreams 示例,但它超出了我的想象,因为我只想发送一个字符串(NSString、char[],没有偏好)而不是文件。

也看过这个例子:How to add data for NSOutputStream?,但这也没有完全帮助。

【问题讨论】:

  • 我应该只传递类似 (const uint8_t *)[strBuffer UTF8String]; 的东西吗?其中 strBuffer 是要写入的缓冲区的 NSString?

标签: iphone network-programming


【解决方案1】:

我已经想通了,并决定在这里回答我自己的问题,以帮助那些处于类似情况的人。

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

- (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 相当随意,您可以根据自己的需要进行更改。

关于上述内容的几点说明。虽然将这些字符串的缓冲区设置得相当大是安全的,但您永远无法保证一次性接收到您的字符串。在实际应用中,您应该仔细设计一个可以依赖的协议来检查您是否收到了整个字符串,并在必要时合并后续NSStreamEvents 期间收到的字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    • 2014-02-09
    相关资源
    最近更新 更多