因此,我有一个输入流和一个输出流,它们作为下面提供的代码进行设置。只有当我将一些数据写入输出流时,才会调用输入流的委托方法NSStreamEventHasBytesAvailable。为什么会这样呢?
// connect to the server and bind the input/output streams
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, _serverAddr, _serverPort,
&readStream, &writeStream);
_inputStream = (__bridge_transfer NSInputStream *)readStream;
_outputStream = (__bridge_transfer NSOutputStream *)writeStream;
// attach the streams to the current processor run loop
[_inputStream setDelegate:self];
dispatch_async(_inputStreamQueue, ^{
[_inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSRunLoopCommonModes];
[_inputStream open];
[[NSRunLoop currentRunLoop] run];
});
dispatch_async(_outputStreamQueue, ^{
[_outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSRunLoopCommonModes];
[_outputStream open];
[[NSRunLoop currentRunLoop] run];
});InputStreamDelegate
- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode
{
dispatch_async(dispatch_get_main_queue(), ^(void) {
if (stream == _inputStream) {
[self inputStreamHandleEvent:eventCode];
}
});
}
- (void)inputStreamHandleEvent:(NSStreamEvent)eventCode
{
switch (eventCode) {
case NSStreamEventHasSpaceAvailable:
{
break;
}
case NSStreamEventEndEncountered:
{
break;
}
case NSStreamEventNone:
{
break;
}
case NSStreamEventErrorOccurred:
{
NSLog(@"NSStreamEventErrorOccurred");
NSError* error = [_inputStream streamError];
NSString* errorMessage = [NSString stringWithFormat:@"%@ (Code = %ld)",
[error localizedDescription],
(long)[error code]];
UIAlertView *wifiLostAlert = [[UIAlertView alloc]
initWithTitle:@"Input Stream Error"
message:errorMessage
delegate:nil
cancelButtonTitle:@"Continue"
otherButtonTitles:nil];
[wifiLostAlert show];
break;
}
case NSStreamEventHasBytesAvailable:
{
uint8_t buf[1024];
int read = 0;
while ([_inputStream hasBytesAvailable])
{
read = [(NSInputStream *)_inputStream read : buf maxLength : 1024];
if (read > 0)
{
NSLog(@"%d bytes read from the input stream.", read);
[_recvBuf appendBytes:(const void *)buf length:read];
int processedBytes = 0;
do
{
processedBytes = [self processPacket];
}
while (processedBytes > 0);
}
else
{
NSLog(@"End of the stream reached, or a socket error. Disconnecting.");
[self disconnect];
}
}
break;
}
case NSStreamEventOpenCompleted:
{
break;
}
}}
我的问题:
因此,对于inputStream,我通过回调读取接收到的数据。这种情况并不总是发生。当服务器返回响应时,它不会读取结果。只有当我通过输出流发送一些数据,然后读取先前通信的输入流值时,输入流才能工作。
的逻辑序列.
我想要的是这个。
1-> 1‘
2-> 2‘
3-> 3‘
这就是现实
1->
2-> 1‘
3-> 2‘
发布于 2014-03-03 06:21:40
原来是服务器端的问题。密码很好。
https://stackoverflow.com/questions/21768302
复制相似问题