Objective c N输出流多次写入

Objective c N输出流多次写入,objective-c,iphone,cocoa-touch,sockets,Objective C,Iphone,Cocoa Touch,Sockets,我试图使用NSStream对象打开套接字,然后在套接字上读写,但我遇到了一个问题 打开插座后,我不知道如何在插座上写字 以下是我的做法 1) 首先打开插座: NSURL *website = [NSURL URLWithString:urlStr]; if (!website) { NSLog(@"%@ is not a valid URL"); return; } NSHost *hos

我试图使用NSStream对象打开套接字,然后在套接字上读写,但我遇到了一个问题

打开插座后,我不知道如何在插座上写字

以下是我的做法

1) 首先打开插座:

 NSURL *website = [NSURL URLWithString:urlStr]; 
        if (!website) { 
            NSLog(@"%@ is not a valid URL"); 
            return; 
        } 
        NSHost *host = [NSHost hostWithName:urlStr]; 
        // iStream and oStream are instance variables 
        [NSStream getStreamsToHost:host port:6667 inputStream:&iStream 
                      outputStream:&oStream]; 
        [iStream retain]; 
        [oStream retain]; 
        [iStream setDelegate:self]; 
        [oStream setDelegate:self]; 
        [iStream scheduleInRunLoop:[NSRunLoop currentRunLoop] 
                           forMode:NSDefaultRunLoopMode]; 
        [oStream scheduleInRunLoop:[NSRunLoop currentRunLoop] 
                           forMode:NSDefaultRunLoopMode]; 
        [iStream open]; 
        [oStream open]; 
2) 设置循环:

- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent
{
    NSString *io;

    if (theStream == iStream) io = @">>";
    else io = @"<<";
    NSLog(@"stream : %@",theStream);

    NSString *event;
    switch (streamEvent)
    {
        case NSStreamEventNone:
            event = @"NSStreamEventNone";
            break;
        case NSStreamEventOpenCompleted:
            event = @"NSStreamEventOpenCompleted";
            break;
        case NSStreamEventHasBytesAvailable:{
            event = @"NSStreamEventHasBytesAvailables";
            if (theStream == iStream)
            {
                if(!_data) { 
                    _data = [[NSMutableData data] retain]; 
                } 
                uint8_t buf[1024]; 
                unsigned int len = 0; 
                len = [iStream read:buf maxLength:1024]; 
                NSLog(@"Lenght data read : %d", len);
                if(len) { 
                    NSData * dataReceived= [[NSString stringWithFormat:@"%s\n", (char *)buf] dataUsingEncoding:NSUTF8StringEncoding];
                    NSString *s = [[NSString alloc] initWithData:dataReceived encoding:NSUTF8StringEncoding];
                    NSLog(@"Received _data: \"%@\"\n",s);



                } else { 
                    NSLog(@"nothing to read!"); 
                } 
            }else {
                NSLog(@"Not the good stream");
            }

            break;
        }

        case NSStreamEventHasSpaceAvailable:{
            event = @"NSStreamEventHasSpaceAvailable";
            if (theStream == oStream )
            {
                if(isConnexionCommandSent == NO){
                    [self sendCommand:@"My connection command"];    
                    isConnexionCommandSent = YES;
                }

            }

            break;
        }

        case NSStreamEventErrorOccurred:
            event = @"NSStreamEventErrorOccurred";
            NSError *theError = [theStream streamError]; 
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:[theError localizedDescription]
                                                           delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
            [alert show];
            [alert release];
            break;
        case NSStreamEventEndEncountered:
            event = @"NSStreamEventEndEncountered";

            break;
        default:
            event = @"** Unknown";
    }

    NSLog(@"%@ : %@", io, event);
}
i>0,因此我假设写操作进行得很顺利,但在服务器上没有收到任何内容。。。我不知道为什么

你能帮我吗

嘿@Ptitaw看。我相信你会在那里找到答案,找到一种更简单的方式来连接并自动访问所有事件(阅读、写作等)
希望我能帮上忙:)

一个非常晚的答案,但是,它可能对有类似问题的人有所帮助

我认为这可能是由于数据编码机制。您的服务器可能正在使用UTF-8编码,而您正在使用NSASCIIStringEncoding发送数据。试试这个:

NSInteger i=[oStream write:(const uint8_t *)[command cStringUsingEncoding:NSUTF8StringEncoding] maxLength:(NSInteger)[command lengthOfBytesUsingEncoding:NSUTF8StringEncoding]];
“[self sendCommand:@“我的连接命令”];”成功?如果“写入”成功,则意味着客户端tcp堆栈现在正在尝试传递这些字节。但是,如果tcp连接已断开,它将无法传递。你确定没有收到数据吗?你是如何验证的?
NSInteger i=[oStream write:(const uint8_t *)[command cStringUsingEncoding:NSASCIIStringEncoding] maxLength:(NSInteger)[command lengthOfBytesUsingEncoding:NSASCIIStringEncoding]];
NSInteger i=[oStream write:(const uint8_t *)[command cStringUsingEncoding:NSUTF8StringEncoding] maxLength:(NSInteger)[command lengthOfBytesUsingEncoding:NSUTF8StringEncoding]];