iPhone SDK通过wifi发送字符串

Sal*_*uts 6 iphone network-programming

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

任何指向优秀教程的指针都会很棒.

我确实看过SimpleNetworkStreams示例,但它只是在我的头上,因为我只想发送一个字符串(NSString,char [],没有偏好)而不是文件.

看一下这个例子:如何为NSOutputStream添加数据?但这也没有完全帮助.

Sal*_*uts 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");
}
Run Code Online (Sandbox Code Playgroud)

在接收端,它看起来像这样:

- (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
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

缓冲区定义为:

#define buffSize 60000
uint8_t buf[buffSize];
Run Code Online (Sandbox Code Playgroud)

60,000 是相当随意的,您可以根据需要更改它。

关于上述内容的一些注意事项。虽然将这些字符串的缓冲区设置得相当大是安全的,但永远不能保证您一次性收到字符串。在实际的应用程序中,您应该仔细设计一个特定的协议,您可以依靠它来检查您是否收到了整个字符串,并在NSStreamEvent必要时合并在后续过程中收到的字符串。