【发布时间】:2010-10-29 10:34:09
【问题描述】:
我真的很想使用 NSInputStream 的 getBuffer:length: 方法。
经过大量研究,我找不到使用此方法的有效示例,因为大多数人确实需要read: maxLength:。
所以现在关于周围环境的一些事实:
* 我正在为 iPhone 开发一个应用程序,iOS 3.1.3
* 我已经通过套接字建立了网络通信
* 该网络连接确实有效;所以我没有忘记向runloop或有效的委托或类似的东西添加一个流 - 它已经工作了
* 我只通过网络发送和接收字符串。
* 我设置了一个有效的委托,它正确地实现了stream: handleEvent:(区分接收到的事件并采取适当的措施)。
我不确定接收代码是否 100% 正确,因为我有时会收到两次消息。
这也可能是我正在与之通信的设备上的错误实现引起的。
为了弄清楚它是最后一个点中的哪一个,我试图找出当我收到“NSStreamEventHasBytesAvailable”事件时接收缓冲区上有多少字节。
因为我不确定我的实现是否正确,但我想知道我收到的实际字节数,我想使用getBuffer: length: 并在之后查看长度。
奇怪的是:长度从未打印在控制台上,因为
[((NSInputStream *) stream) getBuffer: &buf length: &numBytes] 总是评估为 FALSE。
无论如何,之后的代码部分可以正常工作,在缓冲区中接收消息并正确转发 - 工作正常。
问题仍然存在:为什么getBuffer: length: 不起作用?
感兴趣的代码在这里:
` 案例 NSStreamEventHasBytesAvailable: {
uint8_t *buf;
unsigned int numBytes;
if ([((NSInputStream *) stream) getBuffer: &buf length: &numBytes]) {
NSLog(@"\t\tBytes in the buffer: %i", &numBytes);
}
uint8_t buffer[BUFFER_SIZE];
int len = [((NSInputStream *) stream) read: buffer
maxLength: BUFFER_SIZE];
NSLog(@"\tread: %i bytes", len);
/*
if len > 0: len is equal to the filled byte elements
if len == 0: end of buffer was reached while reading
if len < 0: something terrible happened...
*/
if (len > 0) {
/* 1. create string from received byte buffer */
NSString *msg = [[NSString alloc] initWithBytes: buffer length: len encoding: NSASCIIStringEncoding];
NSLog(@"\tcontained message: %@", msg);
/* 2. inform communicator about received message */
[communicator received: msg];
[msg release];
}
if (len < 0) {
[communicator received: @"Error!"];
}
break;
}
`
如果有人可以帮助我,那就太好了!
【问题讨论】: