2009-03-29 23 views
1

Ich möchte ein UIImage zu einem NSOutputStream konvertieren und es über Socket an einen Server senden.Wie füge ich Daten für NSOutputStream hinzu?


#import "Connection.h" 

@implementation Connection 

-(void) open: (NSString *) h : (int) p 
{ 
    strHost = h; 
    intPort = p; 

    [NSStream getStreamsToHost:objHost 
       port:intPort 
      inputStream:&receiveStream 
      outputStream:&sendStream]; 

    [receiveStream retain]; 
    [sendStream retain]; 

    [receiveStream setDelegate:self]; 
    [sendStream setDelegate:self]; 

    [receiveStream scheduleInRunLoop:[NSRunLoop currentRunLoop]     forMode:NSDefaultRunLoopMode]; 
    [sendStream scheduleInRunLoop:[NSRunLoop currentRunLoop]    forMode:NSDefaultRunLoopMode]; 

    [receiveStream open]; 
    [sendStream open]; 

    printf("Open.\n"); 
} 


- (void) stream: (NSStream *) stream handleEvent: (NSStreamEvent) eventCode 
{ 
    printf("EVENT: Start.\n"); 

    switch(eventCode) 
    { 
     case NSStreamEventOpenCompleted: 
     { 
      printf("EVENT: Open completed.\n"); 

      if(stream == receiveStream) 
      { 
       printf("Receiving...\n"); 
      } 

      if(stream == sendStream) 
      { 
       printf("Sending...\n"); 

       NSString * strBuffer = [NSString stringWithFormat:@"GET/HTTP/1.0\r\n\r\n"]; 
       const uint8_t * rawstring = (const uint8_t *)[strBuffer UTF8String]; 

       [sendStream write:rawstring maxLength:strlen(rawstring)]; 
      } 

      break; 
     } 
     case NSStreamEventEndEncountered: 
     { 
      printf("EVENT: End encountered.\n"); 
      break; 
     } 
     case NSStreamEventHasSpaceAvailable: 
     { 
      printf("EVENT: Has space available.\n"); 
      break; 
     } 
     case NSStreamEventHasBytesAvailable: 
     { 
      printf("EVENT: Has bytes available.\n"); 
      break; 
     } 
     case NSStreamEventErrorOccurred: 
     { 
      printf("EVENT: Error occurred.\n"); 
      break; 
     } 
     case NSStreamEventNone: 
     { 
      printf("EVENT: None.\n"); 
      break; 
     } 
    } 

    printf("EVENT: End.\n"); 
} 

-(void) close 
{ 
    [receiveStream close]; 
    [sendStream close]; 

    printf("Closed.\n"); 
} 

@end 


Meine Frage ist, wo kann ich Code wie "sendStream = ..." hinzufügen?

Eine andere Frage ist, dass ich UIImage zu NSData mit umwandeln kann:

NSData *imageData = UIImageJPEGRepresentation(imageView.image, 90);

Aber wie die imagedata zu NSOutputStream der Instanz konvertieren?

Antwort

2

Meine Frage ist, wo kann ich Code wie "sendStream = ..." hinzufügen?

Sie weisen bereits sendStream mit der Nachricht getStreamsToHost:port:inputStream:outputStream: zu. Diese Methode gibt die beiden Datenströme als Referenz zurück.

... wie konvertiert man imageData in die Instanz von NSOutputStream?

Sie müssen die Daten nicht in einen Stream konvertieren. Sie müssen einen Stream anweisen, die Daten zu schreiben.

Versuchen Sie NSOutputStream's write:maxLength: method. Sie müssen die Bytes und die Länge aus dem Datenobjekt übergeben.

+1

Sie können NSData -bytes und -length-Nachrichten für das letzte Bit verwenden. –

+0

Entschuldigung im Chat gefragt, aber sie wussten es nicht und es scheint so als würdest du es tun. Ich versuche, Audiodaten zu streamen. Zur Zeit benutze ich gcdasyncsocket und schreibe die nsdata dazu. Allerdings erhalte ich statische Daten, so dass etwas mit dem Format nicht stimmt. Diese Daten würden nicht anders sein, wenn ich nstream verwenden würde, oder? –

+0

@owengerig: Es wäre nur anders, wenn der Empfangscode - entweder Ihr oder GCDAsyncSocket - falsch ist. Sie haben den Quellcode von GCDAsyncSocket, also streuen Sie NSLogs an den richtigen Stellen und sehen Sie, was es empfängt, bevor es es an Sie weitergibt. Meine Wette wäre nein. –

Verwandte Themen