代码之家  ›  专栏  ›  技术社区  ›  SaltyNuts

iPhone SDK通过wifi发送字符串

  •  6
  • SaltyNuts  · 技术社区  · 15 年前

    我正在尝试向我的应用程序添加一个简单的功能,它只需向另一个设备发送一个预格式化的字符串,非常像WiTap示例代码。这听起来是一件很琐碎的事,但我不能使它工作。如何修改WiTap以发送字符串而不是单个int?

    我确实查看了SimpleNetworkStreams示例,但它超出了我的理解范围,因为我只想发送一个字符串(NSString,char[],没有首选项),而不是一个文件。

    How to add data for NSOutputStream? 但这也没有完全起作用。

    1 回复  |  直到 8 年前
        1
  •  4
  •   SaltyNuts    15 年前

    后来我想明白了,决定在这里回答我自己的问题,为那些处于类似情况的人着想。

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

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

    60000是相当随意的,你可以改变它以满足你的需要。

    NSStreamEvent 如果必要的话。