2010-06-21 116 views
6

我试图向我的应用添加一个简单的功能,它应该简单地将预格式化的字符串发送到另一个设备,非常像WiTap示例代码。这听起来像一个很琐碎的事情,但我不能得到它的工作;(如何修改WiTap发送一个字符串,而不是单个int的iPhone SDK通过wifi发送字符串

好的教程任何指针将是巨大的

我没有看SimpleNetworkStreams样本,但它去的方式在我的头,我只希望发送一个字符串(的NSString,CHAR [],没有特别的偏好),而不是一个文件。

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

+0

我应该只是通过类似 (const uint8_t *)[strBuffer UTF8String]; 其中strBuffer是缓冲区写入的NSString? – SaltyNuts 2010-06-21 20:10:56

回答

4

我自从算出来并决定回答我自己的问题h只是为了那些处于类似情况的人的利益。

每当我想给任何字符串,我用我创造了这个辅助函数:

- (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是相当随意的,你可以改变它以适应你的需求。

关于上述的几点说明。尽管为这些字符串设置相当大的缓冲区是安全的,但您绝对不能保证一次接收字符串。在实际的应用程序中,您应该仔细设计一个可以依赖的特定协议,以检查是否收到了整个字符串,并在后续NSStreamEvent s中收到字符串(如有必要)。